[英]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.