Come posso chiamare la funzione quando una variabile e una funzione hanno lo stesso nome?


10

Una variabile e una funzione hanno lo stesso nome. Come posso chiamare la funzione?

fn main() {
    let a = 1;
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}

Il compilatore Rust mi ha detto:

error[E0618]: expected function, found `{integer}`

In altre parole, il compilatore Rust non chiama la afunzione, ma accede invece alla avariabile.


10
Dichiarerò la soluzione ovvia: non c'è niente che costringe la tua variabile ad avere lo stesso nome della funzione. Cambiarlo.
Shepmaster,

Risposte:


9

Questo non può essere fatto perché non hai sia la funzione che il numero intero nell'ambito in cui hai il tuo println.

Poiché le funzioni sono normalmente disponibili per l'intero ambito (ovvero è possibile utilizzarle prima della loro dichiarazione), la loro dichiarazione viene spostata concettualmente all'inizio dell'ambito (vengono "sollevati").

Una conseguenza è che la dichiarazione della funzione è precedente alla dichiarazione della variabile intera ed è ombreggiata.

La vera correzione del tuo codice dipenderà dalla tua situazione esatta. Forse qualcosa del genere:

fn main() {
    {
        let a = 1;
        // use the integer there
    }
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}

4
Esempio di reverse shadowing per esprimere la stessa idea: play.rust-lang.org/…
Ömer Erden

1
Oppure, sai, non usare lo stesso nome per due oggetti diversi.
Accumulo

Concettualmente sollevato? A me sembra un insetto; l'ambito dovrebbe essere nell'ordine lessicale. EOF-y rivolto verso l'alto, non strapazzato.
Kaz,

4
@Kaz In Rust puoi chiamare una funzione ignorando se è stata dichiarata prima o dopo quella in cui ti trovi. Questo non è un bug, è molto conveniente
Denys Séguret

@ DenysSéguret In tal caso, tutti gli identificatori nello spazio dei nomi devono seguire la stessa regola. Cosa succede se ho una variabile con valori di funzione? Dovrebbe essere trattato allo stesso modo con il mix di funzioni nello stesso ambito.
Kaz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.