【发布时间】:2019-06-06 06:21:28
【问题描述】:
用新类型做一些实验,寻找最有效、最符合人体工程学的方法来处理集合中的元素转换。对于奇异值,相当标准的类型转换特征似乎工作得很好:
pub struct Tag(String);
impl From<Tag> for String {
fn from(v: Tag) -> String {
v.0
}
}
impl From<String> for Tag {
fn from(v: String) -> Tag {
Tag(v)
}
}
impl AsRef<String> for Tag {
fn as_ref(&self) -> &String {
&self.0
}
}
impl<'a> From<&'a Tag> for String {
fn from(t: &Tag) -> String {
t.0.clone()
}
}
但是,当我想处理项目列表时,我开始遇到问题。说(为了说明)我有一个处理标签的函数,还有一些更抽象的函数来处理将字符串写入数据库:
fn process_item(tags: &Vec<Tag>) {
process_array_of_strings(tags);
}
fn process_array_of_strings(strings: &Vec<String>) {
// ...
}
这不会编译,因为 Rust 无法将 tags 强制转换为 Vec<String>,我觉得应该有一些比以下更容易的方法:
fn process_item(tags: &Vec<Tag>) {
let str_tags: Vec<String> = tags.iter().map(|t| t.into()).collect();
process_array_of_strings(&str_tags);
}
...除了冗长之外,还涉及比我想要的更多的中间记忆。反向转换也是一个问题,但大概会以相同的方式实现。
这里可能还有其他一些事情在起作用,例如我是否应该发送引用而不是值的Vecs,以及从引用类型实现类型转换是否是个好主意。
【问题讨论】:
标签: vector collections rust type-conversion newtype