Một FnMut không thể được nhân bản, vì lý do rõ ràng.Bạn có thể nhân bản một đóng cửa không?
Tuy nhiên, Fn có phạm vi bất biến; là có một số cách để tạo ra một 'trùng lặp' của một Fn?
Đang cố gắng để sao chép nó kết quả trong:
&mut core::ops::Fn(logger::Level, &'a collections::string::String) + Send
does not implement any method in scope namedclone
Hoặc là nó an toàn để bằng cách nào đó vượt qua một con trỏ liệu đến một Fn xung quanh, như:
let func_pnt = &mut Box<Fn<...> + Send> as *mut Box<Fn<...>>
Về mặt kỹ thuật các công trình trên, nhưng có vẻ như khá lạ.
Humm, ok, đây là một ví dụ về những gì tôi đang cố gắng để làm:
#![feature(unboxed_closures)]
use std::thread::Thread;
use std::clone::Clone;
struct WithCall {
fp:Box<Fn<(i8,i8), i8> + Send>
}
impl WithCall {
pub fn new(fp:Box<Fn<(i8,i8), i8> + Send>) -> WithCall {
return WithCall {
fp: fp
};
}
pub fn run(&self, a:i8, b:i8) -> i8 {
return self.fp.call((a, b));
}
}
unsafe impl Send for WithCall {}
impl Clone for WithCall {
fn clone(&self) -> WithCall {
return WithCall {
fp: self.fp.clone()
};
}
}
fn main() {
let adder = WithCall::new(Box::new(|&:a:i8, b:i8| -> i8 {
return a + b;
}));
println!("{}", adder.run(1, 2));
let add_a = adder.clone();
let add_b = adder.clone();
Thread::scoped(move || {
println!("In remote thread: {}", add_a.run(10, 10));
});
Thread::scoped(move || {
println!("In remote thread: {}", add_b.run(10, 10));
});
}
tức. Bạn có một cấu trúc với một đóng cửa đóng hộp trong nó, bạn cần phải vượt qua cấu trúc đó cho một số nhiệm vụ; rõ ràng là bạn không thể. ... nhưng bạn cũng không thể sao chép nó, bởi vì bạn không thể sao chép một Box<Fn<>>
và bạn không thể sao chép một playpen &Fn<...>
gì bạn muốn làm với việc đóng cửa nhân bản? – Shepmaster
Mã đầy đủ của bạn là gì? – huon
@shepmaster Tôi đặc biệt muốn sao chép một đóng cửa mà không có trạng thái có thể thay đổi để di chuyển nó vào nhiều tác vụ cùng một lúc. Xem ví dụ tôi đã đính kèm. – Doug