Як мені викликати функцію, коли змінна та функція мають однакове ім'я?


10

Змінна та функція мають те саме ім'я. Як мені викликати функцію?

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

Компілятор Іржі сказав мені:

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-y стороною вгору, не кодиться.
Каз

4
@Kaz У Rust ви можете викликати функцію, не враховуючи, чи була вона оголошена до або після тієї, в якій ви знаходитесь. Це не помилка, це дуже зручно
Denys Séguret

@ DenysSéguret У цьому випадку всі ідентифікатори в цьому просторі імен повинні дотримуватися одного правила. Що робити, якщо у мене функціональна змінна? До цього слід порівнюватись із сумішшю функцій у тому самому масштабі.
Каз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.