如何在 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<&T>
,这次我又遇到了Option<&String>
。我想获得一个拥有的价值Option<String>
。如果我不写map(|x| x.to_owned())
,这可能吗?
我只是想知道是否有办法为任何实用程序特征编写一个全面的实现来实现这一目标?
【问题讨论】:
你也可以写map(ToOwned::to_owned)
【参考方案1】:
Option
带有各种转换的实用方法,在its documentation 中列出。对于任何实现了Clone
(String
实现了)的T
,Option<&T>::cloned
可以满足您的需求。
Clone
比ToOwned
更具体,因此.cloned()
不是.map(|x| x.to_owned())
的精确 匹配项。例如,它不会将Option<&str>
变成Option<String>
;为此,您必须坚持使用map
。
从Rust 1.35开始,当T
是Copy
时,.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>?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用适用于 DynamoDb 的 AWS Rust 开发工具包编写惯用的 Rust 错误处理?