gpt4 book ai didi

rust - 如何在Options和Into之间进行转换?

转载 作者:行者123 更新时间:2023-12-02 18:41:43 24 4
gpt4 key购买 nike

我的项目中有一个结构体A,它在逻辑上与来自不同 crate 的结构体B相关。两者内部都有一个可选的子结构(C/D)。

假设在这个例子中他们有这个结构定义:

struct D {
name: Option<String>
}

struct B {
spec: Option<D>
}

struct C {
name: Option<String>
}

struct A {
spec: Option<C>
}

现在我想将 A 上的 Into 特征实现到 B 中:

impl Into<D> for C {
fn into(self) -> D {
D {
name: self.name
}
}
}

impl Into<B> for A {
fn into(self) -> B {
B {
spec: self.spec.into()
}
}
}

但是 Rust 不允许这样做:

error[E0277]: the trait bound `std::option::Option<D>: From<std::option::Option<C>>` is not satisfied
--> src\model\k8s.rs:615:29
|
615 | spec: self.spec.into()
| ^^^^ the trait `From<std::option::Option<C>>` is not implemented for `std::option::Option<D>`
|
= help: the following implementations were found:
<std::option::Option<&'a T> as From<&'a std::option::Option<T>>>
<std::option::Option<&'a mut T> as From<&'a mut std::option::Option<T>>>
<std::option::Option<&'a tracing_core::span::Id> as From<&'a tracing::span::EnteredSpan>>
<std::option::Option<&'a tracing_core::span::Id> as From<&'a tracing::span::Span>>
and 10 others
= note: required because of the requirements on the impl of `Into<std::option::Option<D>>` for `std::option::Option<C>`

尽管我在 C 上提供了 Into 的自定义实现,但它仅检查 From。我无法提供,因为 D 是另一个 crate 。我必须这样写:

spec: if let Some(v) = self.spec { Some(v.into()) } else { None }

现在的问题是:我缺少更好的方法吗?如果不是,为什么 into() Options 这么麻烦?

最佳答案

问题是您正在调用 Into::into关于Option<C>类型而不是 Option 的类型成立 (C)。

您可以使用 Option::map Option 的内部类型进行操作的方法:

impl Into<B> for A {
fn into(self) -> B {
B {
spec: self.spec.map(Into::into)
}
}
}

没有毯子impl<T, U: Into<T>> Into<Option<T>> for Option<U> (或 From 等效项)在标准库中,这就是为什么你不能使用 Into特质转变Option<T>进入Option<U>直接上Option并且必须依赖Option::map或其他提取内部类型的方式(例如您的最后一个片段)。

关于rust - 如何在Options和Into之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67933310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com