vector - 如何将迭代器元素的类型强制转换为新类型?

标签 vector collections rust type-conversion newtype

用新类型做一些实验,寻找最有效、最符合人体工程学的方法来处理集合中的元素转换。对于奇异值,相当标准的类型转换特征似乎工作得很好:

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 不能强制转换 tagsVec<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);
}

...除了冗长之外,还涉及比我想要的更多的中间内存。反向转换也是一个问题,但大概会以相同的方式实现。

这里可能还有一些额外的事情在起作用,例如我是否应该发送 Vec s 的引用而不是值,以及从引用类型实现类型转换是否是个好主意。

最佳答案

简单,只需使用泛型:

pub struct Tag(String);

impl AsRef<str> for Tag {
    fn as_ref(&self) -> &str {
        &self.0
    }
}

fn process_item(tags: &[Tag]) {
    process_array_of_strings(tags);
}

fn process_array_of_strings<'a, T>(strings: &[T])
where
    T: AsRef<str>,
{
    // ...
}

关于vector - 如何将迭代器元素的类型强制转换为新类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56471878/

相关文章:

pointers - 使用原始指针访问 RefCell<HashMap<T>> 的 &T 是否安全?

.net - 如何以相反的顺序迭代 .Net IList 集合?

java - 从 hashMap 值中获取 id 列表的最佳方法

winapi - Windows SYSTEMTIME 结构与系统时钟不同吗?

vector - 如何沿圆的圆周从向量点 A 移动 n 度? (包括图像)

php - 如何在 Magento 中对集合进行排序?

networking - Rust Alpha 和 Old_IO

c++ - vector 字符串 push_back 在 C++ 中不起作用

c++ - 返回一个 vector (返回类型)

c++ - move std::vector 的 std::unique_locks