変数と関数に同じ名前が付いている場合、関数を呼び出すにはどうすればよいですか?


10

変数と関数は同じ名前です。関数を呼び出すにはどうすればよいですか?

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

Rustコンパイラは私に言った:

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

つまり、Rustコンパイラはa関数を呼び出さず、a変数にアクセスします。


10
私は明白な解決策を述べるよ:何もありません強制関数と同じ名前を持っているあなたの変数が。それを変更。
Shepmaster

回答:


9

あなたが持っているスコープ内に関数と整数の両方がないため、これを行うことはできませんprintln

関数は通常、スコープ全体で使用できるため(つまり、宣言の前に使用できます)、関数の宣言は概念的にスコープの先頭に移動します(「巻き上げられます」)。

結果として、関数宣言は整数変数宣言の前にあり、シャドウされます。

コードの実際の修正は、正確な状況によって異なります。多分このようなもの:

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

4
同じアイデアを表現するために、例えばシャドーイングリバース:play.rust-lang.org/...
オメルErden

1
または、2つの異なるオブジェクトに同じ名前を使用しないでください。
19

概念的に巻き上げられましたか?私にはバグのように見えます。スコープは字句順にする必要があります。EOF-y側を上にし、スクランブルをかけない。
Kaz

4
@Kaz Rustでは、自分がいる関数の前または後に宣言されたかどうかに関係なく、関数を呼び出すことができます。これはバグではなく、とても便利です
DenysSéguretDec

@DenysSéguretその場合、そのネームスペースのすべての識別子は同じルールに従う必要があります。関数値変数がある場合はどうなりますか?同じスコープ内の関数の組み合わせと同等に扱う必要があります。
Kaz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.