Como chamo a função quando uma variável e uma função têm o mesmo nome?

10

Uma variável e função têm o mesmo nome. Como chamo a função?

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

O compilador Rust me disse:

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

Em outras palavras, o compilador Rust não chama a afunção, mas acessa a avariável.

hzqelf
fonte
10
Vou declarar a solução óbvia: não há nada forçando sua variável a ter o mesmo nome que a função. Mude.
Shepmaster

Respostas:

9

Isso não pode ser feito porque você não possui a função e o número inteiro no escopo em que está println.

Como as funções estão normalmente disponíveis para todo o escopo (ou seja, você pode usá-las antes da declaração), a declaração delas é movida conceitualmente para o início do escopo (elas são "içadas").

Uma conseqüência é que a declaração da função está antes da declaração da variável inteira e é sombreada.

A correção real do seu código dependeria da sua situação exata. Talvez algo parecido com isto:

fn main() {
    {
        let a = 1;
        // use the integer there
    }
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}
Denys Séguret
fonte
4
Exemplo de sombreamento reverso para expressar a mesma idéia: play.rust-lang.org/…
Ömer Erden
11
Ou, você sabe, não use o mesmo nome para dois objetos diferentes.
Acumulação
Conceitualmente içada? Parece um bug para mim; o escopo deve estar em ordem lexical. EOF-y voltado para cima, sem embaralhar.
Kaz
4
@Kaz In Rust, você pode chamar uma função desconsiderando se foi declarada antes ou depois daquela em que você está. Este não é um bug, é muito conveniente
Denys Séguret
@ DenysSéguret Nesse caso, todos os identificadores nesse espaço para nome devem seguir a mesma regra. E se eu tiver uma variável com valor de função? Deve ser tratado igualmente com a mistura de funções no mesmo escopo.
Kaz