Bagaimana saya memanggil fungsi ketika variabel dan fungsi memiliki nama yang sama?

10

Variabel dan fungsi memiliki nama yang sama. Bagaimana saya memanggil fungsi?

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

Kompiler Rust memberi tahu saya:

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

Dengan kata lain, kompiler Rust tidak memanggil afungsi, tetapi sebaliknya mengakses avariabel.

hzqelf
sumber
10
Saya akan menyatakan solusi yang jelas: tidak ada yang memaksa variabel Anda memiliki nama yang sama dengan fungsi. Ubahlah.
Shepmaster

Jawaban:

9

Ini tidak dapat dilakukan karena Anda tidak memiliki fungsi dan integer dalam lingkup di mana Anda memiliki println.

Karena fungsi biasanya tersedia untuk seluruh ruang lingkup (yaitu Anda dapat menggunakannya sebelum deklarasi mereka), deklarasi mereka secara konseptual dipindahkan ke awal ruang lingkup (mereka "diangkat").

Konsekuensinya adalah bahwa deklarasi fungsi sebelum deklarasi variabel integer dan dibayangi.

Perbaikan kode Anda yang sebenarnya akan tergantung pada situasi Anda yang sebenarnya. Mungkin kira-kira seperti ini:

fn main() {
    {
        let a = 1;
        // use the integer there
    }
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}
Denys Séguret
sumber
4
Membalikkan contoh bayangan untuk mengekspresikan ide yang sama: play.rust-lang.org/…
Ömer Erden
1
Atau, Anda tahu, tidak menggunakan nama yang sama untuk dua objek berbeda.
Akumulasi
Dikangkat secara konseptual? Tampak seperti bug bagi saya; ruang lingkup harus dalam urutan leksikal. EOF-y menghadap ke atas, tidak teracak.
Kaz
4
@Kaz In Rust Anda dapat memanggil suatu fungsi tanpa menghiraukan apakah itu dideklarasikan sebelum atau sesudah di mana Anda berada. Ini bukan bug, itu sangat mudah
Denys Séguret
@ DenysSéguret Dalam kasus itu, semua pengidentifikasi di namespace harus mengikuti aturan yang sama. Bagaimana jika saya memiliki variabel bernilai fungsi? Itu harus diperlakukan sama dengan campuran fungsi dalam lingkup yang sama.
Kaz