是否可以通过渠道使用任何特质?

时间:2017-07-12 01:00:07

标签: rust

这个例子不对,但它让我知道我的期望:

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也有类似的东西。

1 个答案:

答案 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不带参数。此外,您无法将值转换为特征 - 特征没有已知大小。他们总是需要在某种指针后面。