Как я могу избежать правдивости в Ruby? - PullRequest
4 голосов
/ 05 сентября 2010

Есть ли какой-нибудь стандартный способ избежать правдивости в Ruby, или мне нужно было бы применить собственное решение, такое как

class FalseClass
  def to_bool
    self
  end
end

class TrueClass
  def to_bool
    self
  end
end

true.to_bool # => true
false.to_bool # => false
nil.to_bool # => NoMethodError
42.to_bool # => NoMethodError

Справочная информация: Я знаю, что to_bool будетидти против разрешающей природы Ruby, но я играю с троичной логикой и хочу избежать случайного выполнения чего-то вроде

require "ternary_logic"
x = UNKNOWN
do_something if x

Я использую троичную логику, потому что пишу парсервеб-сайт совместного использования квартиры (для личного, а не коммерческого использования), и в некоторых полях может отсутствовать информация, и поэтому было бы неизвестно, соответствует ли место моим критериям или нет.Однако я бы попытался ограничить количество кода, использующего троичную логику.

Ответы [ 3 ]

9 голосов
/ 05 сентября 2010

Невозможно повлиять на правдивость или ложность в Ruby. nil и false - ложь, все остальное правдиво.

Это функция, которая появляется каждые пару лет или около того, но всегда отклоняется. (По причинам, которые я лично не нахожу убедительными, но я не тот, кто вызывает выстрелы.)

Вам придется реализовать собственную логическую систему, но вы не можете запретить кому-либо использовать логические операторы Ruby с неизвестным значением.

Я однажды заново реализовал логическую систему Руби , для развлечения и чтобы показать, что это можно сделать. Должно быть довольно легко распространить это на троичную логику. (Когда я писал это, я фактически брал тесты соответствия из RubySpec и портировал их на мою реализацию , и все они прошли, так что я вполне уверен, что она соответствует семантике Ruby.)

4 голосов
/ 05 сентября 2010

Вы можете воспользоваться переопределенным оператором ! в 1.9 и идиомой !! для переопределения правдивости.

Давайте иметь Pythonesque правдивость:

class Numeric
  def !
    zero?
  end
end

class Array
  def !
    empty?
  end
end

!![] #=> false
!!0 #=> false
1 голос
/ 22 сентября 2010

Я также создал свою собственную логическую систему в Ruby (для развлечения), и вы можете легко переопределить правдивость: Обратите внимание, что аналогами нормальных условных выражений являются if! / Else_if! / Else!

# redefine truthiness with the `truth_test` method
CustomBoolean.truth_test = proc { |b| b && b != 0 && b != [] }

if!(0) { 
    puts 'true' 
}.
else! { 
    puts 'false' 
}
#=> false

см .: http://github.com/banister/custom_boolean

...