2015-03-24 117 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