在 From 实现中恐慌是惯用的吗?
Is it idiomatic to panic in From implementations?
https://doc.rust-lang.org/std/convert/trait.From.html 处的文档指出
Note: This trait must not fail. If the conversion can fail, use TryFrom.
假设我有一个 From
实现:
impl From<SomeStruct> for http::Uri {
fn from(item: SomeStruct) -> http::Uri {
item.uri.parse::<http::Uri>() // can fail
}
}
进一步假设我完全确定 item.uri.parse
会成功。在这种情况下恐慌是惯用的吗?说,用:
item.uri.parse::<http::Uri>().unwrap()
在这种特殊情况下,似乎无法在编译时构建 HTTP URI:https://docs.rs/http/0.2.5/src/http/uri/mod.rs.html#117。在实际场景中 .uri
是一个关联的常量,所以我可以测试所有使用的值解析。但在我看来,当作者对一段代码的无误性充满信心时,尤其是当这种信心可以在测试中编码时,并且因此更喜欢 From
的人体工程学而不是 [=16] 时,可能会有其他情况=]. Rust 编译器,通常非常严格,不会阻止这种行为,尽管它似乎可以。这让我觉得这是作者被故意允许做出的决定。所以问题是问:人们在这种情况下倾向于做什么?
所以一般来说,特征只强制实施者遵守特征中规定的签名和类型。至少这是编译器强制执行的。
最重要的是,合同预期要遵守某些合同,这样就不会出现奇怪的惊喜谁与这些特征一起工作。编译器不检查这些契约;那将是相当困难的。
没有什么能阻止你实现一个特征的所有方法,但是以与特征完全无关的方式,比如实现 Display
特征但是在 fmt
方法中实际上并不麻烦使用 write!
而不是,我不知道,删除用户的主目录。
现在回到您的具体案例。如果你的 from
方法不会失败,那么你当然可以使用 .unwrap
。 From
trait 的 cannot fail
契约的要点是那些依赖 From
trait 的人希望能够假设每次转换都会经历 。如果您 实际上 在您自己的 from
实现中恐慌,这意味着转换有时 不会 进行,这与想法相反和 From
特征中的合同。
https://doc.rust-lang.org/std/convert/trait.From.html 处的文档指出
Note: This trait must not fail. If the conversion can fail, use TryFrom.
假设我有一个 From
实现:
impl From<SomeStruct> for http::Uri {
fn from(item: SomeStruct) -> http::Uri {
item.uri.parse::<http::Uri>() // can fail
}
}
进一步假设我完全确定 item.uri.parse
会成功。在这种情况下恐慌是惯用的吗?说,用:
item.uri.parse::<http::Uri>().unwrap()
在这种特殊情况下,似乎无法在编译时构建 HTTP URI:https://docs.rs/http/0.2.5/src/http/uri/mod.rs.html#117。在实际场景中 .uri
是一个关联的常量,所以我可以测试所有使用的值解析。但在我看来,当作者对一段代码的无误性充满信心时,尤其是当这种信心可以在测试中编码时,并且因此更喜欢 From
的人体工程学而不是 [=16] 时,可能会有其他情况=]. Rust 编译器,通常非常严格,不会阻止这种行为,尽管它似乎可以。这让我觉得这是作者被故意允许做出的决定。所以问题是问:人们在这种情况下倾向于做什么?
所以一般来说,特征只强制实施者遵守特征中规定的签名和类型。至少这是编译器强制执行的。
最重要的是,合同预期要遵守某些合同,这样就不会出现奇怪的惊喜谁与这些特征一起工作。编译器不检查这些契约;那将是相当困难的。
没有什么能阻止你实现一个特征的所有方法,但是以与特征完全无关的方式,比如实现 Display
特征但是在 fmt
方法中实际上并不麻烦使用 write!
而不是,我不知道,删除用户的主目录。
现在回到您的具体案例。如果你的 from
方法不会失败,那么你当然可以使用 .unwrap
。 From
trait 的 cannot fail
契约的要点是那些依赖 From
trait 的人希望能够假设每次转换都会经历 。如果您 实际上 在您自己的 from
实现中恐慌,这意味着转换有时 不会 进行,这与想法相反和 From
特征中的合同。