将特征作为函数的返回值

时间:2014-05-02 21:23:42

标签: traits rust

我有两个枚举NormalColourBoldColour,两者都实现了Colour特征。它们包含BlueBoldGreen等。

我希望从同一个函数返回这两种类型的值,将它们视为只是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,这就是为什么我对将两个枚举变成一个大枚举不感兴趣。

2 个答案:

答案 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