Явное преобразование к логическому типу в Ruby: идиома !!
Как известно, в Ruby nil
и false
- это значения "ложь", все остальные значения - "истина". Но что если вам необходимо получить строго логический (Boolean) тип: TrueClass
или FalseClass
?
Для явного преобразования подойдёт краткая идиома языка !!
:
# примеры того, как в логических операциях взаимодействуют разные типы p (nil && true) # => nil p (true && nil) # => nil p (nil && false) # => nil p (false && nil) # => false p (nil & true) # => false p (true & nil) # => false p (nil & false) # => false p (false & nil) # => false p (true && 1) # => 1 p (1 && true) # => true p (1 && nil) # => nil p (1 && false) # => false p (false && 1) # => false p (true & 1) # => true p (1 & true) # => 'Integer#&': true can't be coerced into Integer (TypeError) # явное приведение к Boolean p !!(nil && true) # => false p !!(true && nil) # => false # === # тот самый случай, когда выражение возвращает результат разных типов id = nil p !!(id && id.to_i > 0) # => false p (id && id.to_i > 0) # => nil p !!id # => false # --- id = 3 p !!(id && id.to_i > 0) # => true p !!id # => true
Никакой магии и колдовства здесь нет - это 2 логический оператора "не": первый преобразует результат выражения к логическому типу, но при этом производится операция "не", второй - преобразует к исходному логическому значению выражения: true или false.