2015-09-10 4 views
8

"あなた"または "私"の回答を期待している質問をユーザーに聞く簡単な関数をRustに書き込もうとしています。ブール値を返すか、ユーザーが間違って答えた場合には再度質問する必要があります。期待される文字列、オプションの文字列と一致するときに&strが見つかりました

fn player_starts() -> bool {              
    println!("Who will start (me/you)");          
    loop {                  
     let input = readline::readline(">");          
     match input {               
      Some("me") => return true,           
      Some("you") => return false,           
      _ => None,               
     }                   
    }                   
}  

私は何を取得することです:

error: mismatched types: 
expected `collections::string::String`, 
    found `&'static str` 
(expected struct `collections::string::String`, 
found &-ptr) [E0308] 

はここで働くためにリテラルを強制するためにいくつかの方法はありますか私の目標を達成するためにいくつかのより良い方法があります私が思い付きましたか?

答えて

9

:あなたはその上Stringその後、パターンマッチから&strを取得し、成功をexpectことができ、我々はOption<String>から変換

fn player_starts() -> bool {      
    println!("Who will start me/you)");      
    loop { 
     let input = readline::readline(">"); 
     match input.as_ref().map(String::as_ref) { 
      Some("me") => return true, 
      Some("you") => return false, 
      _ =>() 
     } 
    } 
} 

注一致ステートメントで式を、 Option<&str>

4

通常、&strStringに変換する方法は、to_ownedです。

"me".to_owned() 

ただし、Stringでパターンマッチングを行うことはできません。これは動作するはず

fn player_starts() -> bool {              
    println!("Who will start (me/you)");          
    loop {                  
     let input = readline::readline(">"); 
     match input.expect("Failed to read line").as_ref() { 
      "me" => return true,           
      "you" => return false, 
      _ => println!("Enter me or you"), 
     }                   
    }                   
} 
+1

to_string()ではなく、to_owned()や 'into()'(ターゲットタイプがわかっている場合)を使用する方が慣れています。後者は、いくつかのオーバーヘッドを導入するフォーマットコードを呼び出す 'Display'特性によって動作します。ラストがインプルメントのスペシャライゼーションを取得した場合、これは修正される可能性がありますが、まだそこにはありません。 –

+0

@VladimirMatveevありがとう、まだRustにはかなり新しいので、私は最小限の経験に基づいてそのような主張をするべきではないと思う。 – TartanLlama

+0

上記に起因するdownvoteですか?またはこのソリューションには他の問題がありますか? – TartanLlama

関連する問題