2015-06-27 19 views
9

Tôi đang học Rust ngay bây giờ và có vẻ như tôi không thể chỉ định đóng cửa làm thông số chức năng. Dưới đây là những gì tôi có:Không thể vượt qua đóng cửa làm tham số

fn foo(a: i32, f: |i32| -> i32) -> i32 { 
    f(a) 
} 

fn main() { 
    let bar = foo(5, |x| { x + 1 }); 
    println!("{}", bar); 
} 

tôi nhận được lỗi sau:

foo.rs:1:19: 1:20 error: expected type, found `|` 
foo.rs:1 fn foo(a: i32, f: |i32| -> i32) -> i32 { 

Được rồi, vì vậy nó không thích cú pháp đóng cửa. Điều này thật khó chịu, bởi vì bây giờ tôi phải viết điều này:

fn foo(a: i32, f: Box<Fn(i32) -> i32>) -> i32 { 
    f(a) 
} 

fn main() { 
    let bar = foo(5, Box::new(|x| { x + 1 })); 
    println!("{}", bar); 
} 

Vậy điều gì đang xảy ra? Tôi đã đọc trong một vài khác nhau places rằng ví dụ đầu tiên là hợp lệ, do đó, đã được loại bỏ "loại tham số loại" cú pháp này, hoặc tôi chỉ làm điều gì đó sai?

Trả lời

6

Rust đã được phát triển ngay từ đầu và ngôn ngữ đã phát triển rất nhiều kể từ đó. Bài viết về Stack Overflow mà bạn đang liên kết đến gần 1 tuổi, trong thời gian trước 1.0 Rust, miễn là suốt đời ... (chơi có chủ ý)

Câu trả lời đơn giản nhất là: hãy nhớ rằng rất nhiều bài báo, bài đăng trên blog, câu trả lời SO ... không liên quan nữa vì ngôn ngữ đã thay đổi. Nếu bạn thử một giải pháp và nó không hoạt động, chỉ cần tìm cú pháp mới hơn (như bạn đã làm!) Và tiếp tục.

Đối với trường hợp cụ thể này, this RFC ghi lại thay đổi từ |...| -> ... thành Fn/FnMut/FnOnce(...) -> ....

Nhân tiện, có một kế hoạch cho một nỗ lực cộng đồng để tìm các bài viết đã lỗi thời và đánh dấu rõ ràng chúng là không được chấp nhận, để tránh vấn đề cụ thể này. Tuy nhiên, tôi không thể tìm thấy liên kết đến nó.

+1

[RFC 114] (https://github.com/rust-lang/rfcs/blob/master/text/0114-closures.md) phù hợp hơn với thay đổi này so với RFC 231, nhưng chi tiết về RFC 114 không phải là hiện tại (ví dụ, 'Fn' bây giờ là' FnMut' và 'FnShare' bây giờ là' Fn'). –

+0

* đánh dấu rõ ràng chúng là không được dùng nữa * - hoặc chỉ yêu cầu người trả lời khác cập nhật câu trả lời^_ ^. Tôi đã làm như vậy, và nó đã được cập nhật sau vài phút. Bây giờ, câu hỏi này có nên được đánh dấu là trùng lặp không? – Shepmaster

+0

Tôi không có tâm trí, nhưng thay vào đó là các bài đăng trên blog, nơi nội dung không phải là nội dung có thể cập nhật cộng đồng. Nó thậm chí có thể là không mong muốn; ví dụ như các bài đăng trên blog của Niko Matsakis có nhiều thông tin hơn về quy trình suy nghĩ - bạn sẽ giữ nó như một tài liệu tham khảo lịch sử chứ không phải là một tài liệu cập nhật. – mdup

4

Nếu bất cứ ai quan tâm đến câu hỏi này ngày hôm nay, đây là cú pháp với Generics:

fn foo<F: Fn(i32) -> i32>(a: i32, f: F) -> i32 { 
    f(a) 
} 

fn main() { 
    let bar = foo(5, |x| { x + 1 }); 
    println!("{}", bar); 
} 

Hoặc, sử dụng đặc điểm đối tượng:

fn foo(a: i32, f: Box<Fn(i32) -> i32>) -> i32 { 
    f(a) 
} 

fn main() { 
    let bar = foo(5, Box::new(|x| { x + 1 })); 
    println!("{}", bar); 
} 

Bạn nên thích cũ.

Các vấn đề liên quan