¿Cómo llamo a la función cuando una variable y una función tienen el mismo nombre?

10

Una variable y una función tienen el mismo nombre. ¿Cómo llamo a la función?

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

El compilador de Rust me dijo:

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

En otras palabras, el compilador Rust no llama a la afunción, sino que accede a la avariable.

hzqelf
fuente
10
Expondré la solución obvia: no hay nada que obligue a su variable a tener el mismo nombre que la función. Cambialo.
Shepmaster

Respuestas:

9

Esto no se puede hacer porque no tiene tanto la función como el entero en el alcance donde tiene su println.

Debido a que las funciones están normalmente disponibles para todo el ámbito (es decir, puede usarlas antes de su declaración), su declaración se mueve conceptualmente al inicio del ámbito (están "izadas").

Una consecuencia es que la declaración de la función está antes de la declaración de la variable entera y está sombreada.

La solución real de su código dependerá de su situación exacta. Tal vez algo como esto:

fn main() {
    {
        let a = 1;
        // use the integer there
    }
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}
Denys Séguret
fuente
44
Ejemplo de sombreado inverso para expresar la misma idea: play.rust-lang.org/…
Ömer Erden
1
O bien, no use el mismo nombre para dos objetos diferentes.
Acumulación
¿Conceptualmente izado? A mí me parece un insecto; El alcance debe estar en orden léxico. EOF-y hacia arriba, no revuelto.
Kaz
44
@Kaz In Rust puede llamar a una función sin tener en cuenta si fue declarada antes o después de aquella en la que se encuentra. Esto no es un error, es muy conveniente
Denys Séguret
@ DenysSéguret En ese caso, todos los identificadores en ese espacio de nombres deben seguir la misma regla. ¿Qué pasa si tengo una variable con valores de función? Debe tratarse por igual con la combinación de funciones en el mismo ámbito.
Kaz