2015-01-14 2 views
1

У меня есть переменная, которая принимает значение из тремя состояниями булевы:кондиционирования с тремя состояниями логики

asap = true 
asap = false 
asap = nil 

условными Руби истолковывать их как truthy или falsey. Особенно, nil не отличается от false.

asap = nil 
unless asap 
    puts 'False' 
end 
# => 'False' 

Утверждение, что отличает false от nil является:

if asap == false 
    puts 'False' 
end 

но RubyMine 6.3.3 жалуется, что выражение может быть упрощена, и предлагает unless asap. Есть ли другой (правильный) способ сделать кондиционирование?

+4

Blame RubyMine. Это неверно. – sawa

ответ

4

TLDNR;

if FalseClass === asap 
    puts 'False' 
end 

Tri-государство, как правило, предполагает, что существует три возможных ветвей, что заставляет меня думать, что ни if, ни тройная ?, как правило, применяется.

puts case asap 
    when FalseClass then 'False' 
    when TrueClass then 'True' 
    when NilClass then 'Nil' 
    else 'You are kidding on me, aren’t you?' 
    end 

Надеюсь, это поможет.

UPD: Чем больше я думаю об этом, тем больше я склонен думать, что тройных прекрасно, а также:

puts asap.nil? ? 'Nil' : asap ? 'True' : 'False' 

UPD2: На самом деле, три равных оператор Comparision, который прозрачно используется в case и, по-видимому имеет значение true для false === false и true === true может удовлетворить IDEA ака RubyMine, а также:

if asap === false 
    puts 'False' 
end 

UPD3: Как @sawa упоминалось в комментарии, IDEA то здесь не так, поскольку nil == false вычисляет false и поэтому == false обычно не равна unless.

+0

Ваше использование инструкции 'case' является правильным, но я вижу ваш код непоследовательным. Если у вас есть 'false' и' true', то почему бы не «nil» вместо «NilClass»? Или, говоря иначе, если вы используете 'NilClass', то почему вы не используете' TrueClass' и 'FalseClass'? – sawa

+0

@sawa Вы правы; Я хотел показать разные подходы, но в результате я просто испортил вещи. Обновлено. – mudasobwa

+0

Ваша идея с 'case' работает, когда все возможные значения переменных потребляются в одном месте. Мой случай отличается: каждое отдельное состояние проверяется во многих местах приложения, а разные состояния проверяются в разных местах. – Paul

Смежные вопросы