Er farten evaluering for mellom medlems besvergelser garantert?

stemmer
-2

La oss si jeg har en struct med staten, og noen medlemsfunksjoner på at struct. La oss si at struct medlem returnerer en forekomst av sin egen type, og jeg kaller tilleggsfunksjoner på den forekomsten, og passerer et resultat av å kalle noen andre medlemmer på det første tilfellet som et argument. Er rekkefølgen av påkalling mellom første påkallelse, og argumentet påkalling, garantert?

(Dette mønsteret kommer opp mye når du prøver å bygge byggherre type objekter som har en viss intern tilstand, som et uttrykk stabelen.)

package main

import (
    fmt
)

type q struct {
    val int
}

func (s *q) getVal() int {
    return s.val
}

func (s *q) a() *q {
    s.val += 1
    return s
}

func (s *q) b(i int) int {
    return i + s.val
}

func main() {
    s := &q{}
    // this currently prints 2
    // but is that guaranteed?
    fmt.Println(s.a().b(s.getVal()))
}

Nærmere bestemt er den relative rekkefølgen av påkalling s.a()versus s.getVal()garantert? Golang definerer leksikalske venstre mot høyre orden, men bare for et individuelt uttrykk, og s.a().b()virker som det er teknisk sett en annen uttrykk enn s.getVal().

Oppførselen det har i dag er oppførselen jeg ønsker og forventer, men jeg kan ikke si om det er også en atferd jeg kan stole på evig.

Publisert på 13/02/2020 klokken 23:55
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Den relevante delen av spesifikasjonen er:

alle funksjonskall, metodekall, og kommunikasjonsoperasjoner blir evaluert i leksikalsk venstre-til-høyre orden.

og

På pakken nivå, initialisering avhengigoverstyre venstre mot høyre regelen for individuelle initialisering uttrykk, men ikke for operander innenfor hvert uttrykk:

Svarte 14/02/2020 kl. 00:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more