2016-12-22 10 views
3

私はRustの初心者です。この型の問題は解決できません。 &namenameに置き換えようとしましたが、エラー "パターン&_が適用されません"が発生しました。Rustの& 'static strとの照合方法

fn get_project(name: &'static str) { 
    match &name { 
     "hi" => {}, 
    } 
} 

fn main() { 
    let project = get_project("hi"); 
} 

コンパイラエラー:あなたの例で

error[E0308]: mismatched types 
--> <anon>:3:9 
    | 
3 |   "hi" => {}, 
    |   ^^^^ expected &str, found str 
    | 
    = note: expected type `&&str` 
    = note: found type `&'static str` 
+0

http://stackoverflow.com/questions/25383488/how-to-match-a-string-against-string -literals-in-rust – Stargateur

+0

私は見ましたが、私の問題を解決することはできません – maku

答えて

3

namestatic寿命を持っている必要はありません。関数内でnameしか使用していないため、nameは延長された有効期間を持つ必要はありません。 strings chapterを確認してください。錆プログラミング言語&str&'static strを一致させるには、&は必要ありません。変数自体で十分です。

pub fn get_project(name: &str) { 
    match name { 
     "hi" => println!("I found hi!"), 
     _ => println!("Nothing match"), 
    } 
} 

fn main() { 
    get_project("hi"); 
    get_project("42"); 
} 
+0

これは動作します、ありがとうございます。 – maku

+0

@LukasKalbertodtありがとう、私は錆びた新しいです。あなたの答えは非常に明確でした。私はできるだけ早く修正する。 – Stargateur

+0

@Stargateur私はすでにあなたの修正を見た、私のコメントは行った;-)そして、錆に歓迎、あなたはあなたの滞在を楽しむことを願っています^ _ ^ –

6

のような文字列リテラルは、&'static strタイプです。すでに&strを持っているのであれば、あなたは&を追加する必要はありません:彼らはすべての可能なケースをカバーする必要があります。

fn get_project(name: &str) { 
    match name { 
     "hi" => {}, 
     _ => {}, // matches have to be exhaustive 
    } 
} 

錆で試合を網羅する必要があるため、私はまた、デフォルトのケースを追加しました。


はたぶん、あなたは、私はまた、引数リストから'staticを除去したこと、気づきました。あなたが生涯のものについて読んでみたいと思ったら、先に進んでください。それ以外の場合はここで読まないでください。混乱する可能性があり、この場合重要ではないからです。

この関数では、指定された引数の有効期間を'staticに制限する必要はありません。たぶん、あなたはまた、Stringから借用されている文字列のスライスに渡したい:

let user_input = read_user_input(); // type `String` 
get_project(&input); 

コードを使用すると、引数から'staticを削除するときのみ動作上。一度取り外し、機能は同等です:

fn get_project<'a>(name: &'a str) { ... } 

これは、関数が一生'aオーバージェネリックであることを意味しています。関数は言う:任意の生涯'a与えられた、あなたは私に寿命を述べた文字列を与えることができ、私は私のことをすることができます。それは本当です。関数が生涯にわたってそれを行うことができない場合、コンパイラは文句を言うだろう;-)

関連する問題