你可以将泛型限制为T,其中T是Self实现的特征吗?

时间:2015-03-04 01:48:20

标签: rust

例如,有没有办法做到这一点:

use std::marker::PhantomFn;

trait Valid : PhantomFn<Self>  {}
trait Invalid : PhantomFn<Self>  {}

struct Foo;

impl Foo {
    fn as_trait<T: ?Sized>(&self) -> &T where Self: T {
        return self as &T;
    }
}

impl Valid for Foo {}

fn main() {
  let foo = Foo;

  // Should return a trait reference &Valid
  let _ = foo.as_trait::<Valid>();

  // Should fail to compile because Invalid is not implemented for Foo
  let _ = foo.as_trait::<Invalid>(); 
}

即。将泛型限制为仅适用于在Self上实现特征的特征。

1 个答案:

答案 0 :(得分:2)

我认为现在不可能对特征进行通用(并且我没有听说过任何计划),因此Foo: T具有通用T将无效

在期望类型的位置使用特征名称时,它被视为特征对象类型而不是特征。因此,foo.as_trait::<Valid>()将类型变量T实例化为特征对象类型Valid(自您指定?Sized以来允许)。然后,在Self: T中,T是一种类型而不是一种特征,所以这是错误的。

编译器会用更少的单词告诉你相同的事情:

<anon>:9:53: 9:54 error: `T` is not a trait
<anon>:9     fn as_trait<T: ?Sized>(&self) -> &T where Self: T {
                                                             ^