为什么Ruby有TrueClass和FalseClass而不是一个布尔类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (90)

当我发现这个问题时,我正在研究序列化值。Ruby有一个TrueClass类和一个FalseClass类,但它没有任何Boolean类。我想知道这是为什么。

我看到使用Boolean的一些优点; 例如,字符串解析可以集中在它上面。

Ruby开发人员比我更聪明,所以必须有很多我没有看到的好理由。但现在看起来我喜欢有OneClassTwoClass而不是Fixnum

提问于
用户回答回答于

我个人并不同意这一点; 前述的“字符串解析”就是一个例子。另一个是,当你根据类型对变量应用不同的处理时,比如一个yml解析器,具有“布尔”类是很方便的 。它会删除一个“if”。它看起来更正确。

用户回答回答于

一个类的目的是将相似的对象或者具有相似行为的对象组合在一起。12非常相似,因此它们在同一类上是完全合理的。truefalse不过是不相似的。因此,他们不属于同一个类。

你能举出一个例子,说明你会在Boolean类上实施什么样的共同行为?我想不出任何事情。

让我们看看这个行为,TrueClass并且FalseClass有:这里只有四种方法。不再。在每一个案例中,这两种方法完全相反。如何以及为什么要把它放在一个班级中?

以下是你如何实现所有这些方法:

class TrueClass
  def &(other)
    other
  end

  def |(_)
    self
  end

  def ^(other)
    !other
  end

  def to_s
    'true'
  end
end

现在反过来:

class FalseClass
  def &(_)
    self
  end

  def |(other)
    other
  end

  def ^(other)
    other
  end

  def to_s
    'false'
  end
end

所有这些都作为方法实现,并且可以在Ruby中执行相同的操作:

class TrueClass
  def if
    yield
  end

  def ifelse(then_branch=->{}, _=nil)
    then_branch.()
  end

  def unless
  end

  def unlesselse(_=nil, else_branch=->{})
    ifelse(else_branch, _)
  end

  def and
    yield
  end

  def or
    self
  end

  def not
    false
  end
end

另一种方式是:

class FalseClass
  def if
  end

  def ifelse(_=nil, else_branch=->{})
    else_branch.()
  end

  def unless
    yield
  end

  def unlesselse(unless_branch=->{}, _=nil)
    ifelse(_, unless_branch)
  end

  def and
    self
  end

  def or
    yield
  end

  def not
    true
  end
end

扫码关注云+社区