当Option包含一个引用时,我怎样使用Option::unwrap_or_default?

7

我有一个类型为Vec<Candle>的,需要取得它的最后一个元素,并尝试使用unwrap_or_default方法:

self.candle_series.last().unwrap_or_default()

但是我收到了这个错误:
method not found in `std::option::Option<&market::Candle>

如何在结构体上获得 unwrap_or_default 的行为而不是在引用上?

我的当前解决方法如下,但似乎不正确。如果它是正确的,请告诉我:

self.candle_series.last().unwrap_or(&Candle::default())

这并不算太糟糕。仍然比我能想到的任何其他解决方法都要短。 - Alexey Larionov
很难回答你的问题,因为它没有包括一个[MRE](最小可重现示例)。我们无法得知代码中包含哪些 crate (及其版本)、类型、特质、字段等等。如果可能的话,您可以在Rust Playground或全新的 Cargo 项目中尝试复现错误,然后[编辑]您的问题以包括额外的信息,这会让我们更容易地帮助您。在这里有一些Rust MRE 提示,可以用来缩减原始代码以便发布。谢谢! - Shepmaster
请[编辑]您的问题并粘贴您收到的确切和完整错误 - 这将帮助我们了解问题所在,以便我们能够提供最好的帮助。有时尝试解释错误消息是棘手的,实际上重要的是错误消息的不同部分。请使用直接运行编译器生成的消息,而不是IDE生成的消息,后者可能正在尝试为您解释错误。 - Shepmaster
如果向量中没有对象,您期望将引用指向哪个对象?引用必须始终引用有效的对象。 - Tim Diekmann
1个回答

4
我如何在结构体上获得类似于“unwrap_or_default”函数的行为,而不是在引用上?
你需要复制或移动引用(例如使用“Option::cloned”,假设您的结构体是可克隆的),以便您的选项是一个“Option”,并且“unwrap_or_default”可以发挥其作用。
我的当前解决方法是这样的,但它似乎不正确。
对我来说看起来还不错,当然如果您有这样的初始化程序,则使用例如“Candle::new()”可能会更短。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接