pub trait AllValues {
fn all_values() -> Vec<Self> where Self: std::marker::Sized;
}
use rand::Rand;
use rand::Rng;
impl<T: AllValues + Sized> Rand for T {
fn rand<R: Rng, T>(rng: &mut R) -> T {
let values = T::all_values();
let len = values.len();
if len == 0 {
panic!("Cannot pick a random value because T::all_values() returned an empty vector!")
} else {
let i = rng.gen_range(0, len);
values[i]
}
}
}
前面的代码会产生以下编译时错误:
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g. `MyStruct<T>`); only traits defined in the current crate can be implemented for a type parameter
--> src/lib.rs:137:1
|
137 | impl<T: AllValues + Sized> Rand for T {
| ^
根据这里提到的实现特质的限制,我应该能够为
AllValues
实现Rand
,因为AllValues
在我的crate中定义。这是否符合一致性/孤立impl
规则?如果是,那么为实现AllValues
的内容应该采取什么正确的方法呢?
Rand
被定义的地方,这个实例必须被定义。 - undefined