【问题标题】:Rust: Understanding trait `From` implementationRust:理解特征“From”的实现
【发布时间】:2022-12-07 23:51:23
【问题描述】:

如何理解 rust 中的 trait FromWhatever

Rust book 解释如下:

From trait 允许一个类型定义如何从另一个类型创建自己,因此提供了一个非常简单的机制来在多个类型之间进行转换。

听起来很简单。让我们尝试尽可能简单的例子:

use std::str::FromStr;

struct MyStructure {}

// auto accepted suggestion from language server.
impl FromStr for MyStructure {
    type Err = (); // I've added this

    fn from_str(_s: &str) -> Result<Self, Self::Err> {
        Ok(Self {}) // I've added this
    }
}

fn main() {
    const INPUT: &str = "test";
    let _tmp: MyStructure = MyStructure::from(INPUT);
}

playground

Compiling test_range_2 v0.1.0 (/home/pavel/Repositories/test_range_2)
error[E0308]: mismatched types
   --> src/main.rs:15:47
    |
15  |     let _tmp: MyStructure = MyStructure::from(INPUT);
    |                             ----------------- ^^^^^ expected struct `MyStructure`, found `&str`
    |                             |
    |                             arguments to this function are incorrect
    |
note: associated function defined here
   --> /home/pavel/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/convert/mod.rs:374:8
    |
374 |     fn from(_: T) -> Self;
    |        ^^^^

For more information about this error, try `rustc --explain E0308`.
error: could not compile `test_range_2` due to previous error

所以我期待这种行为:

let target: TARGET_TYPE = TARGET_TYPE::from::<SOURCE_TYPE>(input_var: SOURCE_TYPE);

rust book中的例子相比:

let num = Number::from(30);

在我看来,这是一个合理的假设。

但是,阅读错误消息:“expected struct MyStructure, found &amp;str”。这是否意味着语法是这样的?

let target: TARGET_TYPE = TARGET_TYPE::from::<TARGET_TYPE>(input_var: TARGET_TYPE);

如果,那是真的,那么 rust book 中的代码也应该失败并出现错误“expected Number, found i32”,但事实并非如此。

我希望我的解决方案能够工作,因为我已经实现了 trait FromStr,并且我正在尝试从 &amp;str 创建对象(请参阅“from”和“str”?)。这也是我输入 impl FromStr for MyStructure 后由语言服务器自动完成的类型。我错过了什么?我想为我的所有类型实现 FromStr,但编译器并不容易。

【问题讨论】:

  • 该页面专门指core::convert::FromFromStr 是具有不同方法和期望的不同特征。它们的链接方式不允许您执行MyStructure::from(INPUT)
  • 如果你想使用From,你为什么要使用FromStr

标签: rust


【解决方案1】:

FromFromStr 是完全不同且完全不相关的特征。

第一个执行 1 -> 1 可靠的转换,而后者用于解析字符串(这是一个相当古老的特征,它的现代等价物是 TryFrom 但因为 FromStr 挂钩到 str::parse() 它仍然方便和流行)。

在这里你实现FromStr,它对你的From::from调用没有任何作用。

相反,您会被告知一揽子实现:将类型转换为自身是空操作,因此标准库具有

impl<T> From<T> for T

它只是返回自己。

因此编译器的错误信息:当它遇到

MyStructure::from(INPUT);

并尝试将其解决为一个实现,它找到的唯一impl From&lt;?&gt; for MyStructure是一揽子实现,

impl From<MyStructure> for MyStructure

因此它告诉您它需要一个类型为 MyStructure 的参数(它找到的实现的唯一可能输入),但找到了一个 &amp;str(您实际给它的)。

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 2016-05-29
    • 2020-08-15
    • 2021-08-20
    • 2022-08-15
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多