Bir değişken ve işlev aynı ada sahip olduğunda işlevi nasıl çağırırım?


10

Bir değişken ve işlev aynı ada sahiptir. İşlevi nasıl çağırırım?

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

Rust derleyicisi bana şunları söyledi:

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

Başka bir deyişle, Rust derleyicisi aişlevi çağırmaz, bunun yerine adeğişkene erişir .


10
Açık çözümü söyleyeceğim: Değişkeninizi işlevle aynı ada sahip olmaya zorlayan hiçbir şey yok . Değiştir.
Shepmaster

Yanıtlar:


9

Bu yapılamaz, çünkü hem fonksiyonunuza hem de tam sayıya sahip olduğunuz yerde yoktur println.

İşlevler normal olarak tüm kapsam için kullanılabilir olduğundan (yani, açıklamalarından önce bunları kullanabilirsiniz), beyanları kavramsal olarak kapsamın başlangıcına taşınır ("kaldırılır").

Sonuç olarak işlev bildirimi tamsayı değişken bildirgesinden önce gelir ve gölgelenir.

Kodunuzun gerçek düzeltmesi sizin durumunuza bağlıdır. Belki böyle bir şey:

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

4
Aynı fikri ifade etmek için ters gölgeleme örneği: play.rust-lang.org/…
Ömer Erden

1
Ya da, bilirsiniz, iki farklı nesne için aynı adı kullanmayın.
Birikim

Kavramsal olarak çekiliyor mu? Bana bir böcek gibi görünüyor; kapsamı sözcük sırasına göre olmalıdır. EOF-y tarafı yukarı, şifreli değil.
Kaz

4
@Kaz Rust'da, içinde bulunduğunuzdan önce veya sonra bildirilmiş olup olmadığını göz ardı eden bir işlevi çağırabilirsiniz. Bu bir hata değil, çok uygun
Denys Séguret

@ DenysSéguret Bu durumda, o ad alanındaki tüm tanımlayıcılar aynı kurala uymalıdır. İşlev değerli bir değişkenim varsa ne olur? Aynı kapsamdaki işlevlerin karışımı ile eşit olarak ele alınmalıdır.
Kaz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.