2016-08-03 4 views
-1

私が働いている:https://www.codewars.com/kata/the-if-function/Rubyのブール演算子をダブル強打重感嘆符

なぜ三最初の二つの仕事だろうとしませんか?

def _if(bool, ifTrue, ifFalse) 
    bool ? ifTrue.call : ifFalse.call 
end 

def _if(bool, ifTrue, ifFalse) 
    case !!bool 
    when true 
    ifTrue.call 
    when false 
    ifFalse.call 
    end 
end 

def _if(bool, ifTrue, ifFalse) 
    case bool 
    when true 
    ifTrue.call 
    when false 
    ifFalse.call 
    end 
end 

はまた、私は誰かが言ってました「二重否定は関係なく、初期値は、あなたが常にtrueまたはfalse、決していくつかの謎の値を取得することを保証します。」

しかし私の質問は、Rubyのすべてのオブジェクトがブール値であるときに謎の価値が存在する可能性があることです。

答えて

3

あなたの最後の行「Rubyのすべてのオブジェクトがブール値であるとき、どのようなミステリー値が存在する可能性がありますか?」あなたの混乱の源です。それは単に真実ではありません。 Rubyの唯一のブール値は,,falseです。

私は確認することはできませんが、私はあなたのような声明誤解推測している「ゼロ以外のRubyのすべてをしているtruthy。 『Truthy』とは、あなたはそれを使用している場合声明場合(あなたが前に付加しない限り!!、あなたが述べたように)、それは本当だように、それはでも、空の文字列がtruthyです。行動します。しかし、それは実際にはブール値ではありません。

そして、あなた以来例3のcase文は、「値が渡されるとブール値true | false ...」と表示され、unlと一致しませんあなたは文字通りブール値trueまたはfalseを渡します。