通用类型引用的Rust约束

CSa*_*San 6 generics reference constraints rust

这是场景:我有一个结构和特征对,如下所示:

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

无论何时使用,该操作都需要按值传递,并且问题与"do_thing"类似.我宁愿不必为该类型强制执行复制语义,T并希望为此解决此问题.基本上我想知道以下内容:

  1. 是否可以对类型参数的引用强制执行特征约束?有点像:struct Container<T: Sized + Operation> where &T: Operation { ... }.我尝试了一下语法,但我没有取得任何成功.
  2. 如果以上目前不可能,理论上是否可行; 即它不违反任何要求的连贯属性或沿着这些线的东西?
  3. 是否有可能创建第二个特点,比如说Middle: Operation,在那里Middle可以要求任何实施者Middle,T,也需要实现Operation&T.
  4. 如果以上都不可能,还有其他一些常见的解决方法吗?

一些说明:

  • 我没有权限改变这个Operation特性,它是给定的,这就是我要使用的东西.
  • 有一个旧的RFC讨论对where子句的一些修改,但我没有找到任何与引用约束相关的内容.
  • 编译器版本:rustc 1.8.0(db2939409 2016-04-11)

Dog*_*ert 9

是的,你可以限制&TSized + Operation.你需要使用更高等级的特质界限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());
}
Run Code Online (Sandbox Code Playgroud)

版画

1
Run Code Online (Sandbox Code Playgroud)