这里是场景:我有一个结构和特征对,如下所示:
trait Operation {
fn operation(self) -> u32
}
struct Container<T: Sized + Operation> {
x:T
}
impl <T: Sized + Operation> for Container<T> {
fn do_thing(&self) -> u32 {
// Do something with the field x.
}
}
操作需要在使用时进行按值传递调用,并且问题出现与&#34; do_thing类似的任何内容。&#34;我宁愿不必为类型T
强制执行复制语义,并希望为此解决此问题。基本上我想知道以下内容:
struct Container<T: Sized + Operation> where &T: Operation { ... }
的内容。我尝试了一下语法,但我没有取得任何成功。Middle: Operation
,其中Middle
可以要求Middle
,T
的任何实施者也需要实施Operation
的{{1}}。一些注释:
&T
特征,它已经给出了,这也是我要与之合作的内容。答案 0 :(得分:9)
是的,您可以将&T
限制为Sized + Operation
。您需要使用Higher-Rank Trait Bounds和where
。
trait Operation {
fn operation(self) -> u32;
}
struct Container<T>
where for<'a> &'a T: Sized + Operation
{
x: T,
}
impl<T> Container<T>
where for<'a> &'a T: Sized + Operation
{
fn do_thing(&self) -> u32 {
self.x.operation()
}
}
impl<'a> Operation for &'a u32 {
fn operation(self) -> u32 {
*self
}
}
fn main() {
let container = Container { x: 1 };
println!("{}", container.do_thing());
}
打印
1