是否可以在函数的泛型类型上创建具有特征边界的类型别名?

时间:2016-06-17 00:14:48

标签: generics rust function-pointers traits type-alias

此代码:

pub type Foo<T: Read> = fn(bar: T);

产生error E0122(在较新版本的Rust中,它只是一个警告):

  

尝试向类型别名添加通用约束。这个   约束完全被忽略。为了向后兼容,Rust   仍然允许这个警告。请考虑以下示例:

trait Foo {}

type MyType<R: Foo> = (R, ());

fn main() {
    let t: MyType<u32>;
}
     

尽管事实如此,我们仍然可以声明MyType<u32>类型的变量   u32未实施Foo。因此,应该避免使用   与类型别名一致的通用约束。

是否可以创建一个包含函数指针特征要求的类型别名?显然,编译器告诉我没有类型,但不知道是否有其他选项用于我没想到的函数。

2 个答案:

答案 0 :(得分:2)

对于从Rust 1.47.0开始仍然对此感到好奇的任何人,仍然不可能,但是看起来您会收到一条带有说明和建议替代方法的漂亮警告消息。 例如

pub type PublishQueue<T: From<Message>> = (tokio::sync::mpsc::Sender<T>);

收益

note: `#[warn(type_alias_bounds)]` on by default
help: the bound will not be checked when the type alias is used, and should be removed
|
| pub type PublishQueue<T> = sync::mpsc::Sender<T>;
|

答案 1 :(得分:0)

此时,似乎不可能,也没有解决方法。