这个例子不对,但它让我知道我的期望:
fn main() {
let (chan, port) = channel();
load(chan);
let r = port.recv().unwrap().unwrap();
println!("{}", r.downcast_ref::<String>().unwrap());
}
pub fn load<T:Send + Any>(sender: Sender<Option<T>>) {
// do some works
sender.send(Some(String::new("test") as Any);
}
由于这些错误,我无法超越这个:
error: non-scalar cast:
error: cast to unsized type:
我不确定,但使用Serde的Deserialize
/ Serialize
特征,Servo也有类似的东西。
答案 0 :(得分:4)
是的,可以通过频道发送Any
特征的盒装特征对象:
use std::sync::mpsc::{channel, Sender};
use std::any::Any;
fn main() {
let (chan, port) = channel();
load(chan);
let r = port.recv().expect("Unable to receive");
println!("{}", r.downcast_ref::<String>().expect("Not a string"));
}
pub fn load(sender: Sender<Box<Any>>) {
let s = String::from("test");
let s = Box::new(s) as Box<Any>;
sender.send(s).expect("Unable to send");
}
您原来的尝试没有意义:
pub fn load<T:Send + Any>(sender: Sender<Option<T>>)
泛型类型在编译时确定,这意味着T
是固定类型,例如String
。如果您知道通道的类型,则不需要使用Any
String::new("test") as Any
这没有意义,因为String::new
不带参数。此外,您无法将值转换为特征 - 特征没有已知大小。他们总是需要在某种指针后面。