如果我有一个特点,那接受泛型类型受限于该类型的功能,一切工作正常。如果我尝试在该类型的引用来传递,我得到一个编译错误。
trait Trait {
fn hello(&self) -> u32;
}
struct Struct(u32);
impl Trait for Struct {
fn hello(&self) -> u32 {
self.0
}
}
fn runner<T: Trait>(t: T) {
println!("{}", t.hello())
}
fn main() {
let s = Struct(42);
// Works
runner(s);
// Doesn't work
runner(&s);
}
error[E0277]: the trait bound `&Struct: Trait` is not satisfied
--> src/main.rs:24:5
|
24 | runner(&s);
| ^^^^^^ the trait `Trait` is not implemented for `&Struct`
|
= help: the following implementations were found:
<Struct as Trait>
note: required by `runner`
--> src/main.rs:13:1
|
13 | fn runner<T: Trait>(t: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^
我可以通过实施任何引用到实现性状的类型特征解决这个问题:
impl<'a, T> Trait for &'a T
where
T: Trait,
{
fn hello(&self) -> u32 {
(*self).hello()
}
}
这件作品的我就是缺少信息是当我不应该实现这个?问另一种方式,为什么不编译器自动实现这个给我吗?由于它目前没有,我想一定有情况下,有这种实现是不利的。
你写这里的特定性状只需要self
参照,那就是它可以写出你做的额外实施的唯一原因。
为此,取参数按值runner()
可能是不可取;你应该改为通过引用服用。该指南可普遍适用:如果是可以实现的参考特征,然后,而不是想你应该想:“为什么我会实现它?”为唯一的情况下,你会用它或许应该“我要实现它?”来改变通过首先参考拍摄物体。
当我不应该实现这个?问另一种方式,为什么不编译器自动实现这个给我吗?由于它目前没有,我想一定有情况下,有这种实现是不利的。
作为一个例子,Default
特质立即浮现在脑海。
pub trait Default {
fn default() -> Self;
}
我可以实现它T
,但也没有办法自动执行它&T
。