代码之家  ›  专栏  ›  技术社区  ›  Andrew Grimm atk

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

  •  4
  • Andrew Grimm atk  · 技术社区  · 14 年前

    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 share网站的解析器(供个人使用,而不是商业使用),有些字段可能会丢失信息,因此不知道这个地方是否符合我的标准。不过,我会尽量限制使用三元逻辑的代码量。

    3 回复  |  直到 14 年前
        1
  •  9
  •   Community Michael Schmitz    4 年前

    不可能影响Ruby中的真假。 nil false 都是假的,其他的都是真的。

    这是一个每隔几年左右出现一次的功能,但总是被拒绝。(因为我个人不觉得有说服力的原因,但我不是说了算的人。)

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

    I re-implemented Ruby's logic system once ,为了好玩,也为了证明这是可以做到的。把它扩展到三元逻辑应该是相当容易的。(当我写这篇文章时,我实际上从RubySpec和 ported them to my implementation ,它们都通过了,所以我很有信心它符合Ruby的语义。)

        2
  •  4
  •   Andrew Grimm atk    13 年前

    您可以利用可重写 ! 1.9中的运算符和 !! 重新定义真实性的习语。

    class Numeric
      def !
        zero?
      end
    end
    
    class Array
      def !
        empty?
      end
    end
    
    !![] #=> false
    !!0 #=> false
    
        3
  •  1
  •   horseyguy    14 年前

    我还用Ruby制作了自己的逻辑系统(为了好玩),你可以很容易地重新定义真实性: 注意,正常条件的类似物是if!/否则我会的!/否则!

    # 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