2017-01-14 13 views
0

私はWindows x64でRuby 2.26を使用しています。 私はコード作成方法を学ぶのが本当に新しいので、これは本当にバグか、単にバグが非常に簡単なので、私の間違いです。 _ @ルビーでwhileやuntilを使っても同じ結果が得られないのはなぜですか?

'while'と 'until'演算子です。私の知る限りでは

action = gets.chomp 
until action == "a" || action == "b" 
    puts "Answer a or b" 
    action = gets.chomp 
end 

puts "The answer: " + action 

action = gets.chomp 
while action != "a" || action != "b" 
    puts "Answer a or b" 
    action = gets.chomp 
end 

puts "The answer: " + action 

は同じことになるはずです。しかし、ここで 'while'演算子を使うと、powershellのユーザー入力に "a"や "b"を入れても無限ループになります。 これはなぜ誰に教えてもらえますか?それとも本当にバグですか? (しばらく以来、オペレータまでの恥である右の非常に基本的な論理演算子をすべきですか?)

+2

これはルビー特有の問題ではありません。 [ブール代数演算](https://en.wikipedia.org/wiki/Boolean_algebra#Laws)を読むことをお勧めします。 – vlasiak

答えて

6

ソリューション

action == "a" || action == "b" 

の反対は

action != "a" && action != "b" 

De Morgan's Lawsを参照してくださいです。

あなたのコード

action != "a" || action != "b" 

は常にtrueです:

  • action"a"であれば、それはtrue
  • である、false || trueあるaction"b"であれば、それはある、true || falseあるtrue
  • actionはどちらもない場合、それはだからあなたのループが本当にwhile trueあるtrue

である、true || trueです。

注:確かにRubyにはバグがありますが、その中には簡単なものもあります。しかし、あなたが理解できないことはバグだとは限りません。 ;)

言語とブール論理は

文章からブール論理を抽出することは必ずしも容易ではない。

「あなたは猫犬が好き」あなたがあれば知りたいのですがあなたはanimalが好きです。そうするには、animalが犬であるかどうかを確認する必要があります。

animalが犬であることを確認した場合猫、あなたは確かに動物が好きではありません!

+0

私にそれを打つ:) –

+0

ああ、あなたは絶対に正しいです! 私は英語での読みは単に でしたが、 "行動はORアクションではありませんb"です。論理が私をここから逃れる。 私の無知を許してください:Dこれをクリアしていただきありがとうございます。私はいつか素晴らしいコーダーになることができますように〜 – Herschel