5

このコードは、期待どおりに機能しません。

case    
when -> { false } then "why?"        
else "This is what I expect"        
end      
# => "why?"

これもしません

case
when ->(x) {false} then "why?"  
else "This is what I expect"
end  
# => "why?"

最初のthen句はどちらの場合も実行されます。これは、when句に提供するラムダが呼び出されていないことを意味する必要があります。===節の主語が何であれ、大文字小文字の等式演算子を呼び出す必要があることを理解していwhenます。===に引数が指定されていない場合、反対側はどうなるのでしょうかcase。私はそれがそうかもしれないと思っていましたnil、しかしそれはそうすることができません:

-> {false} === nil
# => ArgumentError: wrong number of arguments (1 for 0)

->(x) {false} === nil
# => false

これは期待どおりに実行され、実行された場合、期待したcase結果または例外が発生します。誰かが上記の結果を説明できますか?大文字小文字の等式演算子はまったく使用されていないようですが、最初のwhen句はに評価されていtrueます。ところで、私はこれを行っています。なぜなら、aの出力はcase変数の代入に使用でき、いくつかのelsif句があるよりも言葉が少ないからです。Proc引数のないcaseステートメントで任意のsを使用できるようにしたいと思います。

4

2 に答える 2

7
case    
when -> { false } then puts "why?"        
else puts "This is what I expect"        
end

case    
when 'cat' then puts "why?"        
else puts "This is what I expect"        
end

case    
when -> { false }.call then puts "why?"        
else puts "This is what I expect"        
end

出力:

why?
why?
This is what I expect

Pickaxe(http://pragprog.com/book/ruby3/programming-ruby-1-9)が言うように、caseステートメントには2つの形式があります。

1つ目は、一連の条件を評価して、真の最初の条件に対応するコードを実行できるようにします。‹boolean-expression› + ‹then›..の場合

ケース式の2番目の形式は、ケースキーワードに続くターゲット式を取ります。‹比較› + ‹その後›..の場合のケースターゲット

あなたの場合(ターゲットなし)、またはcaseではない式(Procや文字列'cat'など)はtrueと評価されます。あなたがそれをしない限り、Procは実行されません。falsenilcall

于 2013-01-22T00:07:36.670 に答える
5

パラメータなしでステートメントを使用して、caseステートメントと同様に動作させることができますif。例えば:

case
when x > 0 then puts "positive"
else puts "negative"
end

あなたはそれがと比較しようとしていると仮定していますがnil、そうではありません。むしろ、パラメーターがない場合、caseステートメントは「真の」値(nilおよびを除くすべてfalse)をテストするだけです。whenしたがって、最初のステートメントにヒットすると、(実行の結果ではなくProc実際のrubyProcオブジェクトを意味する)がまたはであるかどうかを確認しますが、そうではありません。それは「真実」なので、そのコードは実行されます。Procnilfalse

Procこれを試してみると、呼び出されたり実行されたりすることさえないことに気付くでしょう(表示されるのは表示されるだけで、表示され"bar"ない"foo"):

case
when -> { puts 'foo' } then puts 'bar'
else puts "This line will never be printed"
end
于 2013-01-21T23:59:07.713 に答える