Ruby booleans double-bang двойной восклицательный знак

-5

Я работаю над: https://www.codewars.com/kata/the-if-function/

Почему первые две работают, а не третье?

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

Также я заметил, что кто-то сказал: "Двойное отрицание гарантирует, что независимо от начального значения вы всегда будете правдивы или фальшивы, никогда не будете иметь какую-то загадочную ценность".

Но мой вопрос в том, какое значение таинственности может иметь место, когда каждый объект в Ruby является логическим?

спросил(а) 2021-01-19T13:22:21+03:00 6 месяцев назад
1
Решение
89

Ваша последняя строка "какое значение таинственности может иметь место, когда каждый объект в Ruby является логическим?" является источником вашей путаницы. Это просто неправда; единственными булевыми в Ruby являются true и false.

Я не могу быть уверен, но я предполагаю, что вы неправильно поняли такое утверждение, как "все в Ruby, кроме false, а nil - правдивое". Truthy означает, что если вы используете его в выражении if, он будет действовать как true. Даже пустая строка является правдой, но на самом деле это не логическое значение true (если вы не добавили !!, как вы отметили).

И так как ваш оператор case в примере 3 говорит "когда значение, которое я передаю, является логическим значением true | false...", оно не будет соответствовать, если вы буквально не передадите логическое значение true или false.

ответил(а) 2021-01-19T13:22:21+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема