È ordine di valutazione go tra invocazioni membri garantito?

voti
-2

Diciamo che ho una struct con lo stato, e alcune funzioni membro del suddetto struct. Diciamo che il membro struct restituisce un'istanza di un proprio tipo, e mi chiamano funzioni aggiuntive su tale istanza, e passano il risultato della chiamata qualche altro membro sulla istanza iniziale come argomento. È l'ordine di invocazione tra la prima invocazione, e l'invocazione argomento, garantito?

(Questo modello viene fornito un sacco quando si cerca di costruire costruttore oggetti di tipo che hanno qualche stato interno, come uno stack di espressione.)

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

In particolare, è l'ordine invocazione relativo di s.a()rispetto s.getVal()garantito? Golang definisce il ordine lessicale sinistra a destra, ma solo per un'espressione individuale, e s.a().b()sembra che sia tecnicamente un'espressione diverso s.getVal().

Il comportamento che ha attualmente è il comportamento che vorrei e si aspettano, ma non posso dire se è anche un comportamento che posso contare su per sempre.

È pubblicato 13/02/2020 alle 21:55
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

La quota di competenza di spec è:

tutte le chiamate di funzione, chiamate di metodo, e operazioni di comunicazione vengono valutate nell'ordine lessicale da sinistra a destra.

e

A livello di pacchetto, le dipendenze inizializzazione sostituiscono la regola da sinistra a destra per le singole espressioni di inizializzazione, ma non per operandi all'interno di ogni espressione:

Risposto il 13/02/2020 a 22:15
fonte dall'utente

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