我怎样才能避免Ruby中的真实性?

时间:2010-09-05 06:44:08

标签: ruby truthiness

是否有任何标准方法可以避免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

我正在使用三元逻辑,因为我正在编写一个flatmate共享网站的解析器(用于个人而非商业用途)并且某些字段可能缺少信息,因此它是未知的这个地方是否符合我的标准。但是,我会尝试限制使用三元逻辑的代码量。

3 个答案:

答案 0 :(得分:9)

不可能在Ruby中影响真实性或虚假性。 nilfalse是假的,其他一切都是真的。

这是每两年左右出现一次的功能,但总是被拒绝。 (由于我个人认为没有令人信服的原因,但我不是那个做主的人。)

您必须实现自己的逻辑系统,但不能禁止某人在未知值上使用Ruby的逻辑运算符。

I re-implemented Ruby's logic system once,为了好玩并展示它可以完成。将其扩展到三元逻辑应该相当容易。 (当我写这篇文章时,我实际上从RubySpec和ported them to my implementation进行了一致性测试,并且它们都通过了,所以我相信它与Ruby的语义相匹配。)

答案 1 :(得分:4)

您可以利用1.9中的可覆盖!运算符和!!惯用语来重新定义真实性。

让我们有一个Pythonesque的真实性:

class Numeric
  def !
    zero?
  end
end

class Array
  def !
    empty?
  end
end

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

答案 2 :(得分:1)

我还在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