在 Rust 中,如何将拥有的对象向量传递给需要借用对象向量的函数?我是创建新向量的唯一选择吗?
对于函数签名的最佳实践是什么,在该函数中我关心结构体所包含的泛型的类型,但不关心它是否被借用?
示例情况:
fn using_vec_of_borrows(borrows: &Vec<&String>) {
//...
}
fn main() {
let foo: Vec<String> = Vec::new();
using_vec_of_borrows(&foo);
}
我怎么能写using_vec_of_borrows()
这样它就接受借用字符串的向量或拥有字符串的向量?或者,如果它是外部库的一部分,我可以将我拥有的字符串向量转换为借用字符串向量而不对其进行迭代吗?
请记住这里String
仅用作示例类型。它可以是任何东西。
引用 @trent 的这个答案 /a/62217143/2189130:
当您听到“通用优于引用和非引用”时,请想一想Borrow<T> https://doc.rust-lang.org/std/borrow/trait.Borrow.html.
使您的函数对实现的元素具有通用性Borrow<String>
将允许它接受两个&Vec<String>
and &Vec<&String>
:
use std::borrow::Borrow;
fn using_vec_of_borrows<T: Borrow<String>>(borrows: &[T]) {
//...
}
fn main() {
let foo: Vec<String> = Vec::new();
using_vec_of_borrows(&foo);
let foo: Vec<&String> = Vec::new();
using_vec_of_borrows(&foo);
}
如果元素不需要连续,您甚至可以将其更改为迭代器以获得更大的灵活性。
注意:我更改了签名&Vec<T>
to &[T]
因为后者更惯用。我会改变的Borrow<String>
into Borrow<str>
出于类似的原因,但是&String
不实施Borrow<str>
.
也可以看看:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)