2016-11-11 3 views
0

こんにちは、私はRubyに慣れています。これは愚かな質問のように思えますが、私が間違っていたことを理解できないようです。Ruby - ループが正しく動作していないようですね

私はこの問題について小説を書かずに何を検索すればいいのか本当に分かりませんでした。

コードの目的は、文字を入力するまでユーザーに入力を依頼することです。ユーザーの入力が「アルファベット」の配列であるかどうかをチェックし、そうであればチェックします手紙は私がランダムに(ちょうど文脈のために、私は絞首刑執行人をコーディングしようとしている)他の場所を選択ワード内であるかどうかを確認するには、「単語」

はここのコードです:

コンソールで
def Check_Alph(word)  
    until $alphabet.include? 'guess' == true 
     puts "Please guess a letter from the alphabet" 
     guess = gets.chomp 
     puts "#{guess}" 
    end 

    if $alphabet.include? 'guess' == true 
     puts "valid letter entered, checking.." 
     $guessed_Letters << guess 
     if word.include? 'guess' == true 
      puts "good guess! That letter was in the word!" 
      puts "Letters confirmed to be in word: #{correct_Letters}"   
     end 
    end  
end 

、それ"アルファベットの手紙を推測してください"というメッセージが表示されたら、手紙を入力するだけで質問が返されます。私は値を正しく取得していることを確認するために "推測"を出力しようとしましたが、実際に何が起こっているかは分かりませんでした。

ご協力いただければ幸いです!

編集:$アルファベットは、文字列 "推測" が含まれるまで

def Check_Alph()  
    guess == nil 
    until $alphabet.include?(guess) 
     puts "Please guess a letter from the alphabet" 
     guess = gets.chomp 
     puts "#{guess}" 
    end  
end 
+1

'== true'は余計なことではありません。この例(括弧なし)では、 '=='はメソッド呼び出しよりも強い束縛を持っているため、実際にはエラーにつながります。 Rubyは '$ alphabet.include?( 'guess' == true)'のようにその行を読み込みます。 '$ alphabet.include?(false)'と同じです。 '$ alphabet'には文字が含まれているので、常に' false'を返します。 – spickermann

答えて

1

2つの問題があります。

最初に変数guessは文字列'guess'と同じではありません。しかし、$alphabetに変数の値ではなく文字列が含まれているかどうかをチェックします。

第2の$alphabet.include? 'guess' == trueは、==がメソッド呼び出しよりも強いバインディングを持つため、エラーになります。 Rubyは次のような行を読み込みます$alphabet.include?('guess' == true)'guess'または変数guessは決してtrueと等しくないため、$alphabet.include?(false)と同じです。

はすでにブール値を返すので、他の人々がすでに指摘したように、== trueを確認する必要は全くありません。

変更

until $alphabet.include? 'guess' == true 

あなたがuntilブロックを開始する前に、また、あなたがそうでなければ、それは不明で、エラーが発生します、guessを定義する必要があります

until $alphabet.include?(guess) 

へ。あなたのメソッドの先頭に、

guess = nil 

を挿入してください。

+0

問題のみ: 'guess'が' until'ブロック内で設定されているので、これは 'NameError'を与えます。 – Stefan

+0

私はあなたが言ったことを(あなたが見ることができるようにメインポストに編集しました)、私は新しいエラーを受け取りました: "Check_Alph ':未定義のローカル変数またはメソッド' guess 'for main:Object(NameError)" 何が問題なのですか?私は最初にそれを宣言したので、うまくいくはずです。 – flanelman

+0

@flanelman: 'guess == nil'を' guess = nil'に変更してください。 '=='は何かが等しいかどうかをチェックし、 '='は値を代入します。ローカル変数 'guess'を定義するには、' guess'に 'nil'を指定する必要があります。 – spickermann

1

ますループ。 しかし、ループ内では$アルファベットに何も追加しないので、ループは終了せず、ifは決して実行されません。

+0

さらに悪い。彼は '$ alphabet'が' false'を含むまでループします。上記の私のコメントをご覧ください。 – spickermann

関連する問題