Comment appeler la fonction lorsqu'une variable et une fonction ont le même nom?

10

Une variable et une fonction ont le même nom. Comment appeler la fonction?

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

Le compilateur Rust m'a dit:

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

En d'autres termes, le compilateur Rust n'appelle pas la afonction, mais accède à la place à la avariable.

hzqelf
la source
10
Je vais énoncer la solution évidente: rien n'oblige votre variable à avoir le même nom que la fonction. Changes le.
Shepmaster

Réponses:

9

Cela ne peut pas être fait car vous n'avez pas à la fois la fonction et l'entier dans la portée où vous avez votre println.

Étant donné que les fonctions sont normalement disponibles pour l'ensemble de la portée (c'est-à-dire que vous pouvez les utiliser avant leur déclaration), leur déclaration est conceptuellement déplacée au début de la portée (elles sont "hissées").

Une conséquence est que la déclaration de fonction est antérieure à la déclaration de variable entière et est masquée.

La vraie correction de votre code dépendrait de votre situation exacte. Peut-être quelque chose comme ça:

fn main() {
    {
        let a = 1;
        // use the integer there
    }
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}
Denys Séguret
la source
4
Exemple d'ombrage inversé pour exprimer la même idée: play.rust-lang.org/…
Ömer Erden
1
Ou, vous savez, n'utilisez pas le même nom pour deux objets différents.
Accumulation
Hissé conceptuellement? Cela ressemble à un bug pour moi; la portée doit être dans l'ordre lexical. Côté EOF-y vers le haut, non brouillé.
Kaz
4
@Kaz In Rust vous pouvez appeler une fonction sans tenir compte si elle a été déclarée avant ou après celle dans laquelle vous vous trouvez. Ce n'est pas un bug, c'est très pratique
Denys Séguret
@ DenysSéguret Dans ce cas, tous les identifiants de cet espace de noms doivent suivre la même règle. Et si j'ai une variable à valeur de fonction? Il doit être traité de manière égale avec le mélange de fonctions dans le même champ d'application.
Kaz