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

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

有帮助吗?

解决方案

不可能影响红宝石的真实性或虚假性。 nilfalse 是虚假的,其他一切都是真实的。

这是一项每隔几年左右就会出现的功能,但总是被拒绝。 (由于我个人没有令人信服的原因,但我不是打镜头的人。)

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

我一次重新完成Ruby的逻辑系统, ,为了娱乐并可以证明它可以做到。将其扩展到三元逻辑应该很容易。 (当我写这篇文章时,我实际上接受了Rubyspec的一致性测试, 将它们移植到我的实施中, ,他们都过去了,所以我非常有信心它与Ruby的语义相匹配。)

其他提示

您可以利用过多的 ! 1.9的操作员 !! 重新定义真实性的成语。

让我们有一个pythones式的真实性:

class Numeric
  def !
    zero?
  end
end

class Array
  def !
    empty?
  end
end

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top