Wie rufe ich die Funktion auf, wenn eine Variable und eine Funktion denselben Namen haben?

10

Eine Variable und eine Funktion haben denselben Namen. Wie rufe ich die Funktion auf?

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

Der Rust-Compiler sagte mir:

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

Mit anderen Worten, der Rust-Compiler ruft die aFunktion nicht auf, sondern greift auf die aVariable zu.

hzqelf
quelle
10
Ich werde die offensichtliche Lösung nennen: Es gibt nichts, was Ihre Variable dazu zwingt , denselben Namen wie die Funktion zu haben. Ändern Sie es.
Shepmaster

Antworten:

9

Dies ist nicht möglich, da Sie nicht sowohl die Funktion als auch die Ganzzahl im Gültigkeitsbereich haben, in dem Sie Ihre haben println.

Da Funktionen normalerweise für den gesamten Bereich verfügbar sind (dh Sie können sie vor ihrer Deklaration verwenden), wird ihre Deklaration konzeptionell an den Anfang des Bereichs verschoben (sie werden "gehisst").

Eine Konsequenz ist, dass die Funktionsdeklaration vor der Ganzzahlvariablendeklaration steht und schattiert ist.

Die tatsächliche Korrektur Ihres Codes hängt von Ihrer genauen Situation ab. Vielleicht so etwas:

fn main() {
    {
        let a = 1;
        // use the integer there
    }
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}
Denys Séguret
quelle
4
Beispiel für umgekehrte Beschattung, um dieselbe Idee auszudrücken: play.rust-lang.org/…
Ömer Erden
1
Oder verwenden Sie nicht denselben Namen für zwei verschiedene Objekte.
Akkumulation
Konzeptionell gehisst? Sieht für mich wie ein Käfer aus; Umfang sollte in lexikalischer Reihenfolge sein. EOF-y Seite nach oben, nicht durcheinander.
Kaz
4
@Kaz In Rust können Sie eine Funktion aufrufen, unabhängig davon, ob sie vor oder nach der Funktion deklariert wurde, in der Sie sich befinden. Dies ist kein Fehler, es ist sehr praktisch
Denys Séguret
@ DenysSéguret In diesem Fall sollten alle Bezeichner in diesem Namespace der gleichen Regel folgen. Was ist, wenn ich eine funktionswertige Variable habe? Es sollte mit dem Funktionsmix im gleichen Umfang gleich behandelt werden.
Kaz