2015-03-24 88 views
0

我有一个大阵列静态分配串片的阵列,像这样定义的:查找字符串切片串片

const ARR: [&'static str; 50] = [...]; 

我然后遍历数组中的什么,我认为是迭代以正常方式(我是新来的锈):

for el in ARR.iter() { 
    if el == target { 
     return true; 
    } 
} 

不幸的是,我发现了一个错误,当我尝试使用eq()

error: the trait `core::cmp::PartialEq<str>` is not implemented for the type `&str` 

标准库中是否有比较字符串切片的东西,还是我必须迭代并比较字符?而且,对于这个问题,是否有更好的方法来搜索数组中的元素而不是我正在做的?

谢谢!

+0

什么是“目标”? – huon 2015-03-24 21:48:23

+0

为什么你写'el.eq(target)'而不是'el == target'? – 2015-03-24 22:25:44

+0

@ huon-dbaupp:我在数组中搜索的字符串 – 2015-03-24 22:28:51

回答

1

这里是你如何可以写你的例子:

const FRUITS: [&'static str; 3] = ["apple", "banana", "coconut"]; 

fn is_available(desired: &str) -> bool { 
    for &el in FRUITS.iter() { 
     // let() = el; // PROTIP 
     if el == desired { 
      return true; 
     } 
    } 

    false 
} 

看到我分配给el()?这是一个小技巧,可以查看某个变量的类型。如果取消对,你会得到这样的错误:

error: mismatched types: 
expected `&&str`, 
    found `()` 

这让你知道的类型是什么。第二部分是看的PartialEq的实现为str,最重要的一个是:

impl PartialEq<str> for str 

所以我们用一个模式绑定el即会自动解除引用一次我们。则比较可能发生,因为我们有提领的平衡量做:

for &el in FRUITS.iter() { 
// ^~~ Here 

不过说真的,我会写这样的:

static FRUITS: [&'static str; 3] = ["apple", "banana", "coconut"]; 

fn main() { 
    let desired = "apple"; 
    let to_eat = FRUITS.iter().find(|&&f| f == desired); 
    println!("{:?}", to_eat); 

    let desired = "durian"; 
    let to_eat = FRUITS.iter().find(|&&f| f == desired); 
    println!("{:?}", to_eat); 
} 

static建立在实际的共享位置内存的变量。 const更像C- 值被插入到使用的任何地方。由于find返回项目,我们需要它有一些存储持续时间比一个表达式更长。

IteratorExt::find也抽象找到匹配值(对于某些条件)的工作,并返回表示成功/失败的Option