在下面的例子中:
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)
在句子中查找单词的正确方法是什么?
最佳答案
contains()
向量上的方法(具体来说,在所有满足 std::vec::ImmutableEqVector
特征的向量上,它适用于包含可以比较相等性的类型的所有向量),具有以下签名,
fn contains(&self, x: &T) -> bool
哪里T
是数组中元素的类型。在您的代码中,str_vec
持有 &str
类型的元素, 所以你需要传入一个 &&str
-- 也就是说,一个指向 &str
的借用指针.
由于 "lorem"
的类型是&'static str
,你可能会先尝试写
str_vec.contains(&"lorem")`
在当前的 Rust 版本中,这是行不通的。 Rust 正在进行语言更改,称为 dynamically-sized types (DST) .副作用之一是表达式 &"string"
的含义和 &[element1, element2]
, 其中&
出现在字符串或数组文字之前,将发生变化( T
是数组元素 element1
和 element2
的类型):
旧行为(从 Rust 0.9 开始仍然有效):表达式
&"string"
和&[element1, element2]
被强制切片&str
和&[T]
, 分别。切片指的是底层字符串或数组的未知长度范围。新行为:表达式
&"string"
和&[element1, element2]
被解释为& &'static str
和&[T, ..2]
,使他们的解释与 Rust 的其余部分一致。
在这两种情况下,获取静态大小的字符串或数组切片的最惯用方法是使用 .as_slice()
方法。一旦你有了一个切片,只需借用一个指向它的指针来获取 &&str
输入 .contains()
需要。最终代码如下(if
条件在 Rust 中不需要用括号括起来,如果你有不必要的括号,rustc 会发出警告):
fn main() {
let str_vec: ~[&str] = "lorem lpsum".split(' ').collect();
if str_vec.contains(&"lorem".as_slice()) {
println!("found it!");
}
}
编译运行得到:
found it!
编辑:最近,一项更改已开始在 ~[T]
上发出警告, 已被弃用,取而代之的是 Vec<T>
类型,它也是一个拥有的向量,但没有特殊的语法。 (现在,您需要从 std::vec_ng
库中导入类型,但我相信模块 std::vec_ng
最终会通过替换当前的 std::vec
而消失。)一旦进行此更改,您似乎就可以'不要借用对 "lorem".as_slice()
的引用因为 rustc 认为生命周期太短——我认为这也是一个错误。在当前的 master 上,我上面的代码应该是:
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!");
}
}
关于rust - 在句子中寻找单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22419399/