首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Ruby有TrueClass和FalseClass而不是一个布尔类?

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

Stack Overflow用户
提问于 2010-07-07 16:15:05
回答 5查看 13.3K关注 0票数 73

当我发现这一点时,我正在处理序列化的值。Ruby有一个TrueClass类和一个FalseClass类,但它没有Boolean类。我想知道为什么会这样。

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

Ruby开发人员比我聪明,所以肯定有很多我看不到的好理由。但现在在我看来,OneClassTwoClass取代了Fixnum

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-13 01:51:24

看起来Matz本人在2004年的一次mailing list message上回答了这个问题。

简而言之,他的回答是:“现在它运行良好,添加一个布尔值不会带来任何优势”。

就我个人而言,我不同意这种说法;前面提到的“字符串解析”就是一个例子。另一个是,当你根据一个变量的类型对它进行不同的处理时(例如,一个yml解析器),有一个"Boolean“类是很方便的--它去掉了一个"if”。它看起来也更正确,但这是我个人的观点。

票数 24
EN

Stack Overflow用户

发布于 2010-07-07 17:15:01

true和false可以由包含多个值的布尔类管理,但类对象必须具有内部值,因此每次使用时都必须取消引用。

相反,Ruby将true和false视为长值(0和1),每个值对应一种对象类类型(FalseClass和TrueClass)。通过使用两个类而不是单个布尔类,每个类不需要任何值,因此可以简单地通过其类标识符(0或1)来区分。我相信这在Ruby引擎内部可以转化为显著的速度优势,因为在内部Ruby可以将TrueClass和FalseClass视为不需要从ID值转换的长值,而布尔对象必须在计算之前被解除引用。

票数 4
EN

Stack Overflow用户

发布于 2011-03-22 09:08:31

因为在Ruby语言中,除了falsenil之外的所有内容在默认情况下都是真的,所以您只需要向String添加解析。

像这样的东西可能会起作用:

代码语言:javascript
复制
class Object

  ## Makes sure any other object that evaluates to false will work as intended,
  ##     and returns just an actual boolean (like it would in any context that expect a boolean value).
  def trueish?; !!self; end

end

class String

  ## Parses certain strings as true; everything else as false.
  def trueish?
    # check if it's a literal "true" string
    return true if self.strip.downcase == 'true'

    # check if the string contains a numerical zero
    [:Integer, :Float, :Rational, :Complex].each do |t|
      begin
        converted_number = Kernel.send(t, self)
        return false if converted_number == 0
      rescue ArgumentError
        # raises if the string could not be converted, in which case we'll continue on
      end
    end

    return false
  end

end

在使用时,这将为您提供:

代码语言:javascript
复制
puts false.trueish?   # => false
puts true.trueish?    # => true
puts 'false'.trueish? # => false
puts 'true'.trueish?  # => true
puts '0'.trueish?     # => false
puts '1'.trueish?     # => true
puts '0.0'.trueish?   # => false
puts '1.0'.trueish?   # => true

我相信Ruby背后的“大创意”的一部分就是让你想要的行为成为程序固有的行为(例如布尔解析),而不是创建一个完全封装的类,它存在于它自己的命名空间中(例如BooleanParser)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3192978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档