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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.