Как вызвать функцию, если переменная и функция имеют одно и то же имя?


10

Переменная и функция имеют одно и то же имя. Как мне вызвать функцию?

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

Компилятор Rust сказал мне:

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

Другими словами, компилятор Rust не вызывает aфункцию, а вместо этого обращается к aпеременной.


10
Я приведу очевидное решение: ничто не заставляет вашу переменную иметь то же имя, что и функция. Измени это.
Шепмастер

Ответы:


9

Это не может быть сделано, потому что у вас нет ни функции, ни целого числа в области видимости, где у вас есть println.

Поскольку функции обычно доступны для всей области (т. Е. Вы можете использовать их до их объявления), их объявление концептуально перемещается в начало области (они «подняты»).

Следствием этого является то, что объявление функции находится перед объявлением целочисленной переменной и является теневым.

Реальное исправление вашего кода будет зависеть от вашей конкретной ситуации. Может быть, что-то вроде этого:

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

4
Пример обратного затенения, чтобы выразить ту же идею: play.rust-lang.org/…
Ömer Erden

1
Или, вы знаете, не используйте одно и то же имя для двух разных объектов.
накопление

Концептуально лапы? Похоже, ошибка для меня; область должна быть в лексическом порядке. EOF-й стороной вверх, не взбитый.
Каз

4
@Kaz В Rust вы можете вызывать функцию независимо от того, была ли она объявлена ​​до или после той, в которой вы находитесь. Это не ошибка, это очень удобно
Денис Сегюре

@ DenysSéguret В этом случае все идентификаторы в этом пространстве имен должны следовать одному и тому же правилу. Что если у меня есть переменная с функцией-значением? К нему следует относиться одинаково со смесью функций в одной и той же области.
Каз
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.