我有两个枚举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
}
}
我需要什么类型才能使函数返回工作?
我最终想制作更多类型的实现Colour
,这就是为什么我对将两个枚举变成一个大枚举不感兴趣。
答案 0 :(得分:7)
答案是特质对象。这意味着您将使用Box<Colour>
作为您的类型;裸Colour
不是可实例化的类型。您可以使用Box<T>
运算符Box<Colour>
将as
个对象投射到Box::new(NormalColour::White) as Box<Colour>
。Box::new(NormalColour::White)
。在许多地方,这不是必需的(只需写Box<Colour>
,它就可以自动强制转换为{{1}}),但有时仍然是必要的。
但是,如果你能把它作为枚举,那可能是一个更好的解决方案。
答案 1 :(得分:2)
以上答案表明:
fn file_colour(stat: &io::FileStat) -> Box<Colour> { /* ... */ }
这是可行的,但是您需要将所有返回值包装在Box::new()
调用中。
但是,在Rust 1.26中,您现在可以说
fn file_colour(stat: &io::FileStat) -> impl Colour { /* ... */ }
,然后简单地返回值。无需Box
。