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
):

  • 旧行为(从0.9开始仍然是最新的):表达式
    &“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!");
    }