簡體   English   中英

rust str 從字符串切片

[英]rust str slice from string

“切片是一種參考,因此它沒有所有權。”

下面的代碼被簡化了。 它需要使用match返回一個切片。 除了一個匹配 arm 之外,所有匹配都返回一個字符串切片。 一個 arm 需要在一個 slice 周圍加上單引號,所以我們轉向使用format! 返回String 然后 String 必須轉換為&str

錯誤顯示生成的切片被匹配 arm 中的臨時字符串引用。

11 |     ret
   |     ^^^ returns a value referencing data owned by the current function

簡化代碼如下。 請注意,我們使用的不是文字,而是從第三方 crate 返回的&str

fn my_func(input: &str) ->&str {
    
    let ret =
        match input {
            "a" => "Apha", // in fact, a &str from a crate
            _ => format!("'{}'", "Quoted" ).as_str(), 
        };
        
    ret
}
 

&str是需要的,因為&str然后使用push_str()推送。

fn main() {
    let mut s = String::new();
    s.push_str(my_func("a"));
    
...

您對在匹配中復制 str 或取消引用 temp 字符串有什么建議?

您不能返回對本地分配的String的引用,因為當 function 返回時該字符串被刪除。 沒有辦法解決這個問題。 &str與您要返回的數據類型不匹配。

最直接的解決方法是返回一個擁有的String

fn my_func(input: &str) -> String {
    match input {
        "a" => "Alpha".to_string(),
        _ => format!("'{}'", "Quoted" ), 
    }
}

另一種方法是返回Cow <'_, str> ,它可以保存借用或擁有的字符串,具體取決於您擁有的字符串。 這有點繁瑣,但確實避免了不必要的分配。 我僅在效率至關重要的情況下才建議這樣做; 否則,只需返回String

fn my_func(input: &str) -> Cow<'_, str> {
    match input {
        "a" => "Alpha".into(),
        _ => format!("'{}'", "Quoted" ).into(), 
    }
}

我還會提到第三種選擇——出於教育目的,而不是實際使用,因為它會泄漏 memory。 如果您泄漏它,您可以獲得對擁有的 object 的'static引用”。 泄露的 memory 對程序的其余部分有效,因為它從未被釋放,因此您實際上可以獲得對它的引用。

// Warning: Do not use! Leaks memory.
fn my_func(input: &str) -> &'static str {
    match input {
        "a" => "Alpha",
        _ => Box::leak(format!("'{}'", "Quoted").into_boxed_str()), 
    }
}

問題是帶有format.().as_str()的 arm 會產生一個擁有的String ,只要您的 function 返回,就會刪除String並且&str引用將變得無效。

您可以使用std::borrow::Cow來允許 function 返回擁有或借用的字符串。

除了其他答案之外,您還可以更改my_func以獲取一個參數,該參數告訴它將結果放在哪里而不是返回它:

use std::fmt::Write;

fn my_func(output: &mut impl Write, input: &str) {
    match input {
        "a" => write!(output, "Apha").unwrap(), // in fact, a &str from a crate
        _ => write!(output, "'{}'", "Quoted" ).unwrap(), 
    };
}

fn main() {
    let mut s = String::new();
    my_func(&mut s, "a");
}

操場

暫無
暫無

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

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