我有两个枚举,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,这就是为什么我不想把两个枚举变成一个大枚举.

推荐答案

答案是trait objects.这意味着你将使用Box<Colour>作为你的类型;bare Colour不是可实例化类型.使用as操作符Box::new(NormalColour::White) as Box<Colour>可以将Box<T>个对象投射到Box<Colour>.在许多地方,这是不必要的(只需写Box::new(NormalColour::White),它可以自动强制为Box<Colour>),但有时仍然是必要的.

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

Rust相关问答推荐

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

`*mut[T]`与`*mut T`的区别

关于 map 闭合求和的问题

为什么&;mut buf[0..buf.len()]会触发一个可变/不可变的borrow 错误?

根据填充系数以相对大小在给定空间中布局项目

如何使用reqwest进行异步请求?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

如何执行数组文字的编译时串联?

可选包装枚举的反序列化

Rust FFI 和 CUDA C 性能差异

Button.set_hexpand(false) 不会阻止按钮展开

如何从trait方法返回std :: iter :: Map?

为什么 Rust 的临时值有时有参考性有时没有?

Rust 中 Mutex<> 的深拷贝?

borrow 匹配手臂内部的可变

哪些特征通过 `Deref` 而哪些不通过?

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

为什么 Rust 编译器在移动不可变值时执行复制?

实现不消费的迭代器

为什么 std::iter::Peekable::peek 可变地borrow self 参数?