Làm thế nào để tôi gọi hàm khi một biến và hàm có cùng tên?


10

Một biến và hàm có cùng tên. Làm thế nào để tôi gọi hàm?

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

Trình biên dịch Rust nói với tôi:

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

Nói cách khác, trình biên dịch Rust không gọi ahàm mà thay vào đó truy cập vào abiến.


10
Tôi sẽ nêu giải pháp rõ ràng: không có gì buộc biến của bạn có cùng tên với hàm. Thay đổi nó.
Người quản lý

Câu trả lời:


9

Điều này không thể được thực hiện bởi vì bạn không có cả hàm và số nguyên trong phạm vi mà bạn có println.

Vì các hàm thường có sẵn cho toàn bộ phạm vi (tức là bạn có thể sử dụng chúng trước khi khai báo), nên khai báo của chúng về mặt khái niệm được chuyển sang đầu phạm vi (chúng được "nâng lên").

Một hậu quả là khai báo hàm nằm trước khai báo biến số nguyên và bị bóng.

Việc sửa lỗi thực sự của mã của bạn sẽ phụ thuộc vào tình huống chính xác của bạn. Có lẽ một cái gì đó như thế này:

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

4
Ví dụ đổ bóng ngược để thể hiện cùng một ý tưởng: play.rust-lang.org/,
Ömer Erden

1
Hoặc, bạn biết, không sử dụng cùng tên cho hai đối tượng khác nhau.
Tích lũy

Khái niệm nâng lên? Trông giống như một lỗi với tôi; phạm vi nên theo thứ tự từ vựng. EOF-y bên lên, không tranh giành.
Kaz

4
@Kaz Trong Rust bạn có thể gọi một hàm bất kể liệu nó đã được khai báo trước hay sau hàm mà bạn đang ở. Đây không phải là một lỗi, nó rất tiện lợi
Denys Séguret

@ DenysSéguret Trong trường hợp đó, tất cả các định danh trong không gian tên đó phải tuân theo cùng một quy tắc. Nếu tôi có một biến có giá trị hàm thì sao? Nó nên được đối xử bình đẳng với sự pha trộn của các chức năng trong cùng một phạm vi.
Kaz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.