Вопрос

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

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 будет идти против разрешительной природы Руби, но я играю с тройной логикой, и хочу не случайно делать что-то вроде

require "ternary_logic"
x = UNKNOWN
do_something if x

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

Это было полезно?

Решение

Невозможно повлиять на правду или фальсию в Руби. nil а также false Являются ли лользий, все остальное является правдой.

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

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

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

Другие советы

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

Давайте иметь питонетическую правду:

class Numeric
  def !
    zero?
  end
end

class Array
  def !
    empty?
  end
end

!![] #=> false
!!0 #=> false

Я также сделал свою собственную логику в Ruby (для удовольствия), и вы можете легко переопределить правду: Примечание, аналоги обычных условных условий, если! / 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top