tôi có mã này ở đây: (Playground link)Generic fn, kênh, và chủ đề spawn
use std::thread;
use std::sync::mpsc::channel;
fn run<T: Send>(task: fn() -> T) -> T {
let (tx, rx) = channel();
thread::spawn(move || {
tx.send(task());
});
rx.recv().unwrap()
}
fn main() {
let task = || 1 + 2;
let result = run(task);
println!("{}", result);
}
Nhưng tôi nhận được một lỗi đời tôi không thể tìm ra.
<anon>:6:5: 6:18 error: the parameter type `T` may not live long enough [E0310]
<anon>:6 thread::spawn(move || {
^~~~~~~~~~~~~
<anon>:6:5: 6:18 help: consider adding an explicit lifetime bound `T: 'static`...
<anon>:6:5: 6:18 note: ...so that captured variable `tx` does not outlive the enclosing closure
<anon>:6 thread::spawn(move || {
^~~~~~~~~~~~~
<anon>:15:22: 15:26 error: mismatched types:
expected `fn() -> _`,
found `[closure <anon>:13:16: 13:24]`
(expected fn pointer,
found closure) [E0308]
<anon>:15 let result = run(task);
^~~~
Mọi đề xuất? Cảm ơn!
này là rất tốt, cảm ơn! Tôi đã cố gắng giải quyết phiên bản đóng cửa ở đây: http://is.gd/8UwpjT - Thêm ''tĩnh' luôn cảm thấy giống như một sự lựa chọn bẩn thỉu. Các tài liệu nói rằng nó có nghĩa là các mục sẽ kéo dài cho cuộc đời của chương trình. Đây có phải là hành động xấu không? Khi nào nó được chấp nhận để sử dụng thời gian sống tĩnh? – jocull
Sau khi thử nghiệm một số, tôi * nghĩ * Tôi hiểu rồi ... http://is.gd/8KWutk ''static' có nghĩa là Trait đã cho là tĩnh - không phải là mục được chuyển vào! Điều này có ý nghĩa hơn. – jocull