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

Posted

技术标签:

【中文标题】如何在 Rust 中以最惯用的方式将 Option<&T> 转换为 Option<T>?【英文标题】:How to convert Option<&T> to Option<T> in the most idiomatic way in Rust? 【发布时间】:2018-12-22 15:06:01 【问题描述】:

当使用HashMap的get方法时,我得到一个Option&lt;&amp;T&gt;,这次我又遇到了Option&lt;&amp;String&gt;。我想获得一个拥有的价值Option&lt;String&gt;。如果我不写map(|x| x.to_owned()),这可能吗?

我只是想知道是否有办法为任何实用程序特征编写一个全面的实现来实现这一目标?

【问题讨论】:

你也可以写map(ToOwned::to_owned) 【参考方案1】:

Option 带有各种转换的实用方法,在its documentation 中列出。对于任何实现了CloneString 实现了)的TOption&lt;&amp;T&gt;::cloned 可以满足您的需求。

CloneToOwned 更具体,因此.cloned() 不是.map(|x| x.to_owned())精确 匹配项。例如,它不会将Option&lt;&amp;str&gt; 变成Option&lt;String&gt;;为此,您必须坚持使用map

从Rust 1.35开始,当TCopy时,.copied().cloned()做同样的事情,但是当T不是Copy时它会编译失败。当您想明确表示克隆很便宜时,您可以使用它。


另见:

How to clone last element from vector? Get the last element of a vector and push it to the same vector

【讨论】:

以上是关于如何在 Rust 中以最惯用的方式将 Option<&T> 转换为 Option<T>?的主要内容,如果未能解决你的问题,请参考以下文章

在高维空间中以最优方式计算成本

如何在swift中以最简单的方式画一条线

如何使用适用于 DynamoDb 的 AWS Rust 开发工具包编写惯用的 Rust 错误处理?

如何在 SwiftUI 中以编程方式滚动列表?

HOWTO:使用 gtk (rust-gnome) 回调的惯用 Rust

如何将两个 Rust 向量按三个块交错成一个新向量?