String 是否有一种不那么冗长的方法可以从字符串向量中获取默认字符串?
我试过用String 是否有一种不那么冗长的方法可以从字符串向量中获取默认字符串?,string,rust,String,Rust,我试过用&str代替字符串,但这有编译错误。我的结局是: fn main() { let words: Vec<String> = vec!["apple".to_string(), "orange".to_string(), "banana".to_string()]; let word: String = match words.get(4) { Some(s) => s.to_string() , None =>
&str
代替字符串,但这有编译错误。我的结局是:
fn main()
{
let words: Vec<String> = vec!["apple".to_string(), "orange".to_string(), "banana".to_string()];
let word: String = match words.get(4)
{
Some(s) => s.to_string()
, None => "nil".to_string()
};
println!("word: {}", word);
}
fn main()
{
让单词:Vec=Vec![“苹果”。to_string(),“橙色”。to_string(),“香蕉”。to_string();
让word:String=匹配单词。get(4)
{
一些=>s.到_字符串()
,None=>“nil”。to_string()
};
println!(“单词:{}”,单词);
}
在决定&str
和字符串
时,记住的强制规则很重要
fn main()
{
让words=vec![“苹果”、“橘子”、“香蕉”];//vec
让word=匹配words.get(2){/&str
一些(&s)=>s
无=>“无”
};
println!(“单词:{}”,单词);
}
如果长度仍然是您关心的问题,您可以合并单词和单词
匹配代码,但我认为这(可能包括类型注释)是最简洁的,不会影响清晰度。我不太确定您想要实现什么,但这可能是实现您在代码中所做工作的最佳方式:
fn main() {
let words = vec!["apple", "orange", "banana"];
let word = words.get(4).cloned().unwrap_or("nil").to_string();
println!("word: {}", word);
}
棘手的部分是cloned()
:get()
方法将返回对向量内部值的可选引用。但由于向量已经包含引用,我们最终得到了选项
(两个引用)。cloned()
调用删除一个引用,因此我们有选项
另外请注意,在本例中,最后的to_string()
调用是不必要的——我们只能使用&str
来完成所有操作。有两件事可以立即帮助缩短此程序:
类型推断:您很少需要写出类型
&str
:这里对和\u string
的调用太多了
我会这样写:
fn main() {
let words = vec!["apple", "orange", "banana"];
let word = match words.get(4) {
Some(&s) => s,
None => "nil"
};
println!("word: {}", word);
}
请注意,Vec::get
返回一个选项,因此这里是一个选项
,因为我们希望s
类型为&str
(single&
),所以我们使用一些(&s)
作为模式。另一个选项是Some(s)=>*s,
(这里,让s
be&&str
并取消对它的引用)
当然,通过查看的特定API,可以进一步减少这一切。有些不太通用,但在Rust中经常使用选项
和结果
(在前奏中有这么多),因此值得学习它们的API
在这种情况下,unwrap\u或
将提供选项
内的值或传递给它的值:
fn main() {
let words = vec!["apple", "orange", "banana"];
let word = *words.get(4).unwrap_or(&"nil");
println!("word: {}", word);
}
有点参考杂耍来排列类型(又名俄罗斯方块类型),这一切都很好。非常好和清晰。在我第一次尝试使用&str
时,我错过了一些(&s)
。谢谢