Rust 在句子中查找单词
在以下示例中:Rust 在句子中查找单词,rust,Rust,在以下示例中: fn main() { let str_vec: ~[&str] = "lorem lpsum".split(' ').collect(); if (str_vec.contains("lorem")) { println!("found it!"); } } 它不会编译,并且说: error: mismatched types: expected &&'static str but found 'static str (expe
fn main() {
let str_vec: ~[&str] = "lorem lpsum".split(' ').collect();
if (str_vec.contains("lorem")) {
println!("found it!");
}
}
它不会编译,并且说:
error: mismatched types: expected &&'static str
but found 'static str (expected &-ptr but found &'static str)
找到句子中单词的正确方法是什么?向量上的方法(具体地说,在满足std::vec::ImmutableEqVector
特征的所有向量上,该特征适用于所有包含可以进行相等比较的类型的向量),具有以下特征
fn contains(&self, x: &T) -> bool
其中T
是数组中元素的类型。在您的代码中,str\u vec
保存类型为&str
的元素,因此需要传入&str
——也就是说,一个借来的指向&str
的指针
由于“lorem”
的类型是&'static str
,因此您可以尝试先编写
str_vec.contains(&"lorem")`
在当前版本的Rust中,这不起作用。锈病处于一种称为“语言变化”的中间。一个副作用是,表达式&“string”
和&[element1,element2]
的含义将发生变化(T
是数组元素的类型element1
和element2
):
&“string”
和&[element1,element2]
分别被强制为切片&str
和&[T]
。切片指的是底层字符串或数组的未知长度范围&“string”
和&[element1,element2]
被解释为&&'static str
和&[T,…2]
,使它们的解释与其他表达式一致.as\u slice()
方法。一旦你有了一个切片,只需借用一个指向该切片的指针,就可以得到.contains()
所需的&&str
类型。最后一个代码如下(Rust中的if
条件不需要用括号括起来,如果确实有不必要的括号,Rust C将发出警告):
编译并运行以获取:
found it!
编辑:最近,出现了一个更改,开始在
~[T]
上发出警告,该更改已被弃用,取而代之的是Vec
类型,该类型也是一个自有向量,但没有特殊语法。(目前,您需要从库中导入类型,但我相信模块std::vec_ng
最终将通过替换当前的std::vec
)一旦进行此更改,您似乎无法借用对“lorem”的引用
因为rustc认为生命周期太短——我认为这也是一个bug。在当前主机上,我的上述代码应为:
use std::vec_ng::Vec; // Import will not be needed in the future
fn main() {
let str_vec: Vec<&str> = "lorem lpsum".split(' ').collect();
let slice = &"lorem".as_slice();
if str_vec.contains(slice) {
println!("found it!");
}
}
使用std::vec\u ng::vec;//今后不需要进口
fn main(){
让str_vec:vec=“lorem lpsum”.split(“”).collect();
让slice=&“lorem”.as_slice();
如果str_vec.包含(切片){
println!(“找到了!”);
}
}
您还可以使用
.position()
或.count()
来代替.any()
。请参阅。这与DST没有多大关系,只是因为我不清楚的原因,决定将和“lorem”
等同于“lorem”
,无论是好是坏。您只需要参考一下:&&“lorem”
(不是&&“lorem”
,因为&&
将被解析为二进制和运算符)。对于最新版本的Rust(2014年3月14日),上述解决方案无法编译-“借用值的寿命不够长”错误@ChrisMorgan的替代作品。@ChrisMorgan对&“string”
和&[1,2,3]
的解释确实严格地不依赖于DST,但我的印象是,它们必须随着DST而改变。我知道&(“lorem”)
和&&“lorem”
也起作用,但我认为.as\u slice()
是一个更好的解决方案,因为.as\u slice()
无论最终是什么字符串和向量都能起作用。幸运的是,~[]
的弃用lint恰好在我回答这个问题之后出现在rust nightly Ubuntu包中!这是超级翔实的答案,非常感谢!我希望我能把它标记为背景文学或其他东西。
use std::vec_ng::Vec; // Import will not be needed in the future
fn main() {
let str_vec: Vec<&str> = "lorem lpsum".split(' ').collect();
let slice = &"lorem".as_slice();
if str_vec.contains(slice) {
println!("found it!");
}
}
let sentence = "Lorem ipsum dolor sit amet";
if sentence.words().any(|x| x == "ipsum") {
println!("Found it!");
}