Jak wywołać funkcję, gdy zmienna i funkcja mają tę samą nazwę?


10

Zmienna i funkcja mają tę samą nazwę. Jak wywołać funkcję?

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

Kompilator Rust powiedział mi:

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

Innymi słowy, kompilator Rust nie wywołuje afunkcji, ale zamiast tego uzyskuje dostęp do azmiennej.


10
Podam oczywiste rozwiązanie: nic nie zmusza twojej zmiennej do nadania tej samej nazwie co funkcja. Zmień to.
Shepmaster,

Odpowiedzi:


9

Nie można tego zrobić, ponieważ nie masz zarówno funkcji, jak i liczby całkowitej w zakresie, w którym masz println.

Ponieważ funkcje są zwykle dostępne dla całego zakresu (tzn. Można ich używać przed deklaracją), ich deklaracja jest koncepcyjnie przenoszona na początek zakresu (są „podnoszone”).

Konsekwencją jest to, że deklaracja funkcji znajduje się przed deklaracją zmiennej liczby całkowitej i jest zacieniona.

Prawdziwa poprawka kodu zależy od dokładnej sytuacji. Może coś takiego:

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

4
Przykład odwrotnego cieniowania, aby wyrazić ten sam pomysł: play.rust-lang.org/…
Ömer Erden

1
Lub, no wiesz, nie używaj tej samej nazwy dla dwóch różnych obiektów.
Kumulacja

Podniesiony koncepcyjnie? Wygląda mi to na błąd; zakres powinien być uporządkowany leksykalnie. EOF-y stroną do góry, nie kodowaną.
Kaz

4
@Kaz W Rust możesz wywołać funkcję, niezależnie od tego, czy została zadeklarowana przed czy po tej, w której jesteś. To nie jest błąd, jest to bardzo wygodne
Denys Séguret,

@ DenysSéguret W takim przypadku wszystkie identyfikatory w tej przestrzeni nazw powinny być zgodne z tą samą regułą. Co jeśli mam zmienną o wartości funkcji? Powinno być traktowane równo z zestawem funkcji w tym samym zakresie.
Kaz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.