Czy Go kolejność oceny pomiędzy wywołaniami członkowskich gwarantowane?

głosy
-2

Powiedzmy mam struct ze strony państwa, a kilka funkcji członka na tej struktury. Powiedzmy, że człon struct zwraca instancję swoim rodzaju i wzywam dodatkowe funkcje na tej instancji, i przekazać wynik wywołania innego członka na początkowym przykład jako argument. Czy kolejność wywołania między pierwszym wezwaniem i wezwaniem argumentów, gwarantowane?

(Wzór ten pojawia się wiele, gdy próbuje zbudować „Builder” obiekty typu, które w jakiś stan wewnętrzny, jak stos ekspresji).

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()))
}

W szczególności, jest względny porządek wywołanie s.a()kontra s.getVal()gwarantowane? Golang definiuje „leksykalny kolejności od lewej do prawej”, ale tylko dla indywidualnej ekspresji, i s.a().b()wydaje się, że jest to technicznie inny wyraz niż s.getVal().

Zachowanie to obecnie jest zachowanie i chciałbym się spodziewać, ale nie mogę powiedzieć, czy jest to również zachowanie może polegać na „zawsze”.

Utwórz 13/02/2020 o 21:55
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Odpowiednia część specyfikacji jest:

wszystkie wywołania funkcji, wywołania metod i działania komunikacyjne są oceniane w leksykalnym kolejności od lewej do prawej.

i

Na poziomie pakietu, zależności inicjalizacji zastępują lewy-prawy reguły dla poszczególnych wyrażeń inicjujących, ale nie dla argumentów obrębie każdego wyrażenia:

Odpowiedział 13/02/2020 o 22:15
źródło użytkownik

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