Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

Явное преобразование к логическому типу в 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.