Est-go ordre d'évaluation entre les invocations membres garanti?

voix
-2

Disons que j'ai un struct avec l'état, et quelques fonctions membres sur ce struct. Disons que le membre struct renvoie une instance de son propre type, et j'appeler des fonctions supplémentaires sur ce cas, et passer le résultat de l'appel d'un autre membre de l'instance initiale comme argument. L'ordre d'appel entre le premier appel, et l'invocation de l'argument, garanti?

(Ce modèle arrive beaucoup en essayant de construire des objets de type « constructeur » qui ont un état interne, comme une pile d'expression.)

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

, Est précisément l'ordre d'appel relatif de s.a()contre s.getVal()garantie? Golang définit le « lexical pour-droite-gauche » , mais seulement pour une expression individuelle, et s.a().b()semble que ce soit techniquement une expression différente de celle s.getVal().

Le comportement qu'il a actuellement est le comportement que je veux et attends, mais je ne peux pas dire si c'est aussi un comportement que je peux compter sur « pour toujours ».

Créé 13/02/2020 à 23:55
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

La partie pertinente de la spécification est la suivante :

tous les appels de fonction, les appels de méthode et les opérations de communication sont évaluées dans l'ordre lexical à droite à gauche.

et

Au niveau du package, les dépendances d'initialisation remplacent la règle à droite à gauche pour les expressions d'initialisation individuelles, mais pas pour opérandes dans chaque expression:

Créé 14/02/2020 à 00:15
source utilisateur

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