繁体   English   中英

如何将特征绑定到非泛型类型?

[英]How to add trait bound to a non-generic type?

我有这个简单的通用 function:

fn add_five<T: Into<i32>>(t: T) -> i32 {
    5_i32 + t.into()
}

我想使用From特征而不是Into特征来表达,但是我尝试重构:

fn add_five<T, i32: From<T>>(t: T) -> i32 {
    5_i32 + <i32 as From<T>>::from(t)
}

引发此编译错误:

error[E0277]: cannot add `i32` to `i32`
  --> src/main.rs:24:11
   |
   |     5_i32 + <i32 as From<T>>::from(t)
   |           ^ no implementation for `i32 + i32`
   |
   = help: the trait `Add<i32>` is not implemented for `i32`

这很令人困惑,因为标准库中确实有一个impl Add<i32> for i32 ,那么真正的问题是什么?

添加绑定到非泛型类型的特征只能通过 where 子句完成:

fn add_five<T>(t: T) -> i32
where
    i32: From<T> // now compiles!
{
    5_i32 + <i32 as From<T>>::from(t)
}

<T, i32: From<T>>失败的原因是编译器将<>中使用的所有名称解析为泛型类型参数的标识符。

错误消息令人困惑,因为当i32引用具体的 32 位签名 integer 类型与同名泛型类型参数的函数本地标识符时,编译器没有说明这一点(现在它也隐藏了具体的 integer 类型)。

这是错误消息,但添加了说明:

error[E0277]: cannot add `i32` (generic type) to `i32` (concrete integer type)
  --> src/main.rs:24:11
   |
   |     5_i32 + <i32 (generic type) as From<T>>::from(t)
   |           ^ no implementation for `i32 (concrete integer type) + i32 (generic type)`
   |
   = help: the trait `Add<i32 (generic type)>` is not implemented for `i32` (concrete integer type)

或者用令人困惑的模棱两可的i32代替更传统的U作为泛型类型:

error[E0277]: cannot add `U` to `i32`
  --> src/main.rs:24:11
   |
   |     5_i32 + <U as From<T>>::from(t)
   |           ^ no implementation for `i32 + U`
   |
   = help: the trait `Add<U>` is not implemented for `i32`

解决方法是简单地将边界移动到 where 子句中,如上所述,以避免意外地将i32声明为泛型类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM