例如,有没有办法做到这一点:
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上实现特征的特征。
答案 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 {
^