当我发现这一点时,我正在处理序列化的值。Ruby有一个TrueClass
类和一个FalseClass
类,但它没有Boolean
类。我想知道为什么会这样。
我看到了使用Boolean
的一些优点;例如,字符串解析可以集中在它上。
Ruby开发人员比我聪明,所以肯定有很多我看不到的好理由。但现在在我看来,OneClass
和TwoClass
取代了Fixnum
。
发布于 2010-07-13 01:51:24
看起来Matz本人在2004年的一次mailing list message上回答了这个问题。
简而言之,他的回答是:“现在它运行良好,添加一个布尔值不会带来任何优势”。
就我个人而言,我不同意这种说法;前面提到的“字符串解析”就是一个例子。另一个是,当你根据一个变量的类型对它进行不同的处理时(例如,一个yml解析器),有一个"Boolean“类是很方便的--它去掉了一个"if”。它看起来也更正确,但这是我个人的观点。
发布于 2010-07-07 17:15:01
true和false可以由包含多个值的布尔类管理,但类对象必须具有内部值,因此每次使用时都必须取消引用。
相反,Ruby将true和false视为长值(0和1),每个值对应一种对象类类型(FalseClass和TrueClass)。通过使用两个类而不是单个布尔类,每个类不需要任何值,因此可以简单地通过其类标识符(0或1)来区分。我相信这在Ruby引擎内部可以转化为显著的速度优势,因为在内部Ruby可以将TrueClass和FalseClass视为不需要从ID值转换的长值,而布尔对象必须在计算之前被解除引用。
发布于 2011-03-22 09:08:31
因为在Ruby语言中,除了false
和nil
之外的所有内容在默认情况下都是真的,所以您只需要向String添加解析。
像这样的东西可能会起作用:
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
在使用时,这将为您提供:
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)。
https://stackoverflow.com/questions/3192978
复制相似问题