如何在 Rust 中别名 Into<Option<T>>?

米格威尔

这是Into<Option<T>>Rust 中用于可选参数的常见模式,因为它允许使用用户友好的任一None或某些来调用函数t: T但是我发现这种类型注释有点冗长,所以我想给这个模式取别名。

在 Rust 中稳定真正的特征别名之前,似乎有一个别名特征的黑客:https : //www.worthe-it.co.za/blog/2017-01-15-aliasing-traits-in-rust.html .

在我的情况下如何使用它?我尝试了以下代码:

pub trait Optional<T>:Into<Option<T>>{}
impl<T> Optional<T> for T where T: Into<Option<T>>{}

fn main(){
    add(3.0, None);
    add(1.0, 2.0);
}

fn add<T: Optional<f64>>(a: f64, b: T) -> f64 {
    let b = match b.into() {
        Some(b) => b,
        None => 0.0
    };

    a + b
}

但是编译器说:

error[E0277]: the trait bound `Option<_>: Optional<f64>` is not satisfied
 --> test.rs:5:14
  |
5 |     add(3.0, None);
  |              ^^^^ the trait `Optional<f64>` is not implemented for `Option<_>`
...
9 | fn add<T: Optional<f64>>(a: f64, b: T) -> f64 {
  |           ------------- required by this bound in `add`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

很明显,hack 不起作用,因为编译器无法检测到任何f64None应该实现此接口。

如何修复此别名以使其正确编译?

扬·胡德克

这里涉及两个类型参数。T是可选值的类型,因此f64在您的示例中。所以

impl<T> Optional<T> for T where T: Into<Option<T>>{}

只执行Optional<f64> for f64. 但是您也想为其他类型实现它,因此您需要使用不同的类型参数。尝试

impl<T, U> Optional<T> for U where U: Into<Option<T>> {}

现在终于可以( ), ( ) 和任何其他类型实现Optional<f64>( T=f64) 了f64U=f64Option<f64>U=Option<f64>Into<Option<T>>

......我应该把它写成

impl<ValueT, ConvertibleT> Optional<ValueT> for ConvertibleT
    where ConvertibleT: Into<Option<ValueT>>

因为字母T和具有多个参数的泛型没有什么特别之处,所以它们的参数应该像通常为函数参数所做的那样正确命名。

游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Rust - 如何在 Option<T> 中引用 T 值

如何在Rust中以最惯用的方式将Option <&T>转换为Option <T>?

在Rust中,如何向Option <Option <T >>添加“ flatten”?

在Option <T>中使用T作为Rust中的函数参数

如何在Rust中创建Vec <T>,其中T:Into <_>?

在Rust中处理多个`Option <T>`的惯用方式是什么?

从 Rust 中的 RefCell<Option<Rc<T>>> 获取引用

如何以 Rust 中最惯用的方式将 Option<T> 转换为 Option<&T>?

如何在Rust中获得Vec <T>的切片?

如何在Rust中为Vec <T>分配空间?

隐式排序[Option [T]]如何在Scala中工作?

Rust,如何从<Option> Some()中“拉出”数据以独立使用

Rust中严格的别名?

如何基于Rust中的编译标志创建类型别名?

如何在Rust 2018中习惯性地使用板条箱别名?

如何在Rust中输出“ {}”

如何在一個班輪中將 Option 慣用地轉換為 Rust 中的 bool?

在 Result<Option<T>> 的情况下,简化 Rust 中的错误处理

为什么在 Rust 中 `min_by` 和 `max_by` 返回 `Option<T>`?

Rust中的类型别名

如何在Rust中将枚举用作值别名?

如何在 Rust 中通过 Vec<T> 分配修复 STATUS_ACCESS_VIOLATION?

如何通过在Rust中实现`Deref`来返回由Option包裹的引用?

如何处理或测试类型是否为Rust宏中的Option?

如何在Rust中声明接口?

如何在Rust中实现装饰器?

如何在Rust中执行指针算术?

如何在Rust中读取YAML文件?

如何在 Rust 中旋转链表?