4

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

我正在使用三元逻辑,因为我正在编写一个室友共享网站的解析器(供个人使用,而非商业用途),并且某些字段可能缺少信息,因此不知道该位置是否是否符合我的标准。但是,我会尝试限制使用三元逻辑的代码数量。

4

3 回答 3

9

不可能影响 Ruby 中的真假。nil并且false是虚假的,其他一切都是真实的。

这是一个每隔几年左右就会出现的功能,但总是被拒绝。(出于我个人认为没有说服力的原因,但我不是那个发号施令的人。)

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

我重新实现了一次 Ruby 的逻辑系统,是为了好玩并表明它是可以做到的。将其扩展到三元逻辑应该相当容易。(当我写这篇文章时,我实际上从 RubySpec 中获取了一致性测试并将它们移植到我的实现中,它们都通过了,所以我相当有信心它符合 Ruby 的语义。)

于 2010-09-05T10:31:33.127 回答
4

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

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

class Numeric
  def !
    zero?
  end
end

class Array
  def !
    empty?
  end
end

!![] #=> false
!!0 #=> false
于 2010-09-05T11:24:20.993 回答
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

于 2010-09-22T07:39:47.540 回答