簡體   English   中英

轉換 Vec<String> 在 Rust 中放入一片 &amp;str ?

[英]Convert Vec<String> into a slice of &str in Rust?

根據Steve Klabnik 在 Rust 1.0 之前的文檔中關於String&str之間區別的文章,在 Rust 中,您應該使用&str除非您確實需要對String擁有所有權。 同樣,建議使用引用切片( &[]而不是Vec小號,除非你真的需要通過所有權Vec

我有一個Vec<String>並且我想編寫一個使用此字符串序列的函數,並且它不需要對VecString實例的所有權,該函數是否應該采用&[&str] 如果是這樣,將Vec<String>引用到&[&str]的最佳方法是什么? 或者,這種脅迫是否太過分了?

您可以使用AsRef trait創建一個接受&[String]&[&str]AsRef

fn test<T: AsRef<str>>(inp: &[T]) {
    for x in inp { print!("{} ", x.as_ref()) }
    println!("");
}

fn main() {
    let vref = vec!["Hello", "world!"];
    let vown = vec!["May the Force".to_owned(), "be with you.".to_owned()];
    test(&vref);
    test(&vown);
}

如果沒有內存分配1 ,這實際上是不可能的。

String&str不僅僅是以不同的方式查看位; String&str具有不同的內存布局,因此從一個到另一個需要創建一個新對象。 這同樣適用於Vec&[]

因此,雖然您可以從Vec<T>轉到&[T] ,從而從Vec<String>轉到&[String] ,但您不能直接從Vec<String>轉到&[&str] 您的選擇是:

  • 要么接受&[String]
  • 分配一個新的Vec<&str>參考第一Vec ,並轉換&[&str]

作為分配的示例:

fn usage(_: &[&str]) {}

fn main() {
    let owned = vec![String::new()];

    let half_owned: Vec<_> = owned.iter().map(String::as_str).collect();

    usage(&half_owned);
}

1所需的轉換是不可能的,但是使用泛型和AsRef<str>綁定,如@aSpex的答案所示,您會得到一個稍微冗長的函數聲明,並具有您所要求的靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM