我怎样才能避免Ruby中的真实性?

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

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

在Ruby中不可能影响真实性或虚假性。 nilfalse都是假的,其他一切都是真的。

它是每两年左右出现的一个function,但总是被拒绝。 (由于我个人认为没有说服力的原因,但我不是那个做主的人。)

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

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

你可以利用可覆盖的优势! 操作员在1.9和!! 成语重新定义真实性。

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

 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