Tôi đang cố gắng thực hiện một số chương trình bậc cao hơn trong Rust, nhưng tôi đang gặp một số khó khăn khi xử lý các đóng. Dưới đây là một đoạn mã minh họa một trong những vấn đề tôi đang gặp:"không thể di chuyển giá trị kiểu FnOnce" khi di chuyển chức năng được đóng hộp
pub enum Foo {
Bar(Box<FnOnce(i32)>),
}
pub fn app(i: i32, arg: Foo) {
match arg {
Foo::Bar(f) => f(i),
}
}
Khi tôi biên dịch đoạn mã này tôi nhận được thông báo lỗi sau:
error[E0161]: cannot move a value of type std::ops::FnOnce(i32) + 'static: the size of std::ops::FnOnce(i32) + 'static cannot be statically determined
--> src/main.rs:7:24
|
7 | Foo::Bar(f) => f(i),
| ^
Kể từ khi tôi đặt các chức năng trong một Box
, tôi đã có thể nghĩ rằng sẽ đối phó với vấn đề của trình biên dịch không biết kích thước. Làm thế nào tôi có thể làm cho chương trình trên biên dịch?
Cảm ơn câu trả lời.Sử dụng loại đóng cửa thực sự không phải là một lựa chọn cho tôi vì tôi cần có khả năng lưu trữ các bao đóng khác nhau trong enum. Tôi không biết làm thế nào để thực hiện công việc gợi ý 'Box', tôi gặp lỗi khi tôi thử. Những gì tôi đã làm thay vào đó là chỉ cần nói 'Hộp '. Điều đó đã giúp tôi biên dịch ví dụ trên. Tuy nhiên, tôi không thể tạo một enum bằng cách sử dụng loại đó vì nó không phù hợp với loại đóng. Vì vậy, tôi đoán tôi còn lại với cố gắng một trình biên dịch hàng đêm. –
svenningsson
@svenningsson: Sử dụng 'Box' thay thế; bởi vì 'FnMut' là" đối tượng an toàn ", bạn * có thể * gọi một từ thông qua một' Hộp' (hoặc bất kỳ sự thực sự nào).Điều duy nhất bạn không thể làm là có đóng cửa tiêu thụ các giá trị (mặc dù bạn có thể làm việc xung quanh đó với 'Option'). –
Lỗi tôi nhận được khi tôi thử 'Hộp' như sau: không thể mượn bất biến 'Nội dung hộp '' * f' là có thể thay đổi src/lib.rs: 36 Foo :: Bar (f) => f (i) –
svenningsson