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

48
当我使用HashMap的get方法时,返回了一个Option<&T>值,这次我又遇到了Option<&String>。我想获得拥有所有权的Option<String>值。有没有不用写map(|x| x.to_owned())的方法来实现呢?
我只是想知道是否有一种通用工具特性的全局实现方式来实现这个目标?

6
你也可以写成 map(ToOwned::to_owned) - Boiethios
1个回答

49

Option提供了多种转换的实用方法,可以在它的文档中查看。对于任何实现了Clone trait的类型(包括String),Option<&T>::cloned可以达到您所需的效果。

CloneToOwned更具体,因此.cloned() .map(|x| x.to_owned())并不完全匹配。例如,它无法将Option<&str>转换为Option<String>;对于这种情况,您需要使用map

从Rust 1.35开始,当TCopy时,.copied().cloned()的功能相同,但当T不是Copy时会编译失败。当您想明确表明克隆是廉价的时候,可以使用它。


另请参阅:


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