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 (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 是数组元素 element1element2 的类型):

  1. 旧行为(从 Rust 0.9 开始仍然有效):表达式 &"string"&[element1, element2]被强制切片 &str&[T] , 分别。切片指的是底层字符串或数组的未知长度范围。

  2. 新行为:表达式 &"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/

相关文章:

rust - Err 不接受已转换的参数 "to_string"

rust - 如何从 actix_web::HttpRequest 获取(二进制)有效载荷

rust - 如何在 Rust 中处理/规避 "Cannot assign to ... which is behind a & reference"?

string - 在Rust中返回格式化的字符串

rust - 火箭的“响应者”特征未针对“结果”实现

syntax - `impl TraitX for TraitY` 在 Rust 中意味着什么?

rust - 如何获取有序集合/有序映射的最大值和最小值?

rust - 返回对特征而不是结构的引用

rust - 如何中止 Rust 进程?

rust - RFC 401 的 coerce_inner 有什么用?