将特征作为函数的返回值

Ben*_*n S 9 traits rust

我有两个枚举,NormalColour并且BoldColour都实现了这个Colour特性.它们包含Blue,BoldGreen等等.

我想从同一个函数返回这两个类型的值,将它们视为只是一个Colour值,paint在结果上调用函数,但我找不到强制执行Rust编译器的方法这对我来说.我希望能够写出这样的东西:

pub trait Colour {
    fn paint(&self, input: &str) -> String;
}

fn file_colour(stat: &io::FileStat) -> Colour {
    if stat.kind == io::TypeDirectory {
        Blue
    } else if stat.perm & io::UserExecute == io::UserExecute {
        BoldGreen
    } else {
        White
    }
}
Run Code Online (Sandbox Code Playgroud)

我有什么类型才能使函数返回工作?

我最终想制作更多类型的实现Colour,这就是为什么我不想将这两个枚举变成一个大枚举.

Chr*_*gan 7

答案是特质对象.这意味着您将Box<Colour>作为您的类型工作; bare Colour不是可实例化的类型.您可以向操作员投射Box<T>对象:.在许多地方这不是必要的(只是写,它可以自动强制),但有时它仍然是必要的.Box<Colour>asBox::new(NormalColour::White) as Box<Colour>Box::new(NormalColour::White)Box<Colour>

不过,如果你能把它作为枚举,这可能是一个更好的解决方案.