代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken

如果(!)x)vs ruby中的if(x==false)

  •  11
  • Aaron Yodaiken  · 技术社区  · 15 年前

    我不理解以下代码:

    ruby-1.9.1-p378 > puts "nil is false" unless nil
    nil is false
     => nil 
    ruby-1.9.1-p378 > puts "nil isn't false" unless nil == false
    nil isn't false
     => nil 
    

    在大多数语言中(至少是C基),如果(!cond)和if(cond==false)计算相同的值。这到底是怎么回事?

    (我想知道原因的细节,我明白这就是原因。)

    3 回复  |  直到 9 年前
        1
  •  31
  •   Marc-André Lafortune    15 年前

    鲁比认为 false nil 只有两种“不可靠”的价值观,而其他一切都是“真实的”。这是根据定义的,不能修改(至少在MRI中)。此定义用于所有内置运算符,如 if , unless , while , until , cond ? if_truthy : if_falsey , || , && ,…

    写作 foo == bar 将始终调用 == 方法对 foo 具有 bar 作为一个论点。默认情况下, , , true 所有其他的瞬间,如符号,等等,都是平等的。不过,这可能会改变:

    def nil.==(bar)
      super || bar == false
    end
    puts "nil == false" if nil == false  # => "nil == false"
    

    在Ruby1.9中,还可以重新定义运算符 ! 如此 unless foo 不一定和 if !foo 或者相反的 if foo :

    def true.!
      true
    end
    
    puts "True?"   if  true # => "True?"
    puts "or not?" if !true # => "or not?"
    

    不是说有人会建议你做这样的事…

        2
  •  2
  •   Joel    9 年前

    nil 通过比较不等于假 == 因为它们的语义内容不同( 没有信息,而false是布尔值)。但是,如果你试图评估 在布尔上下文中,它被认为是错误的,主要是为了方便和与其他语言的惯用兼容性。

    nil == a <=> nil != a <=> false 对于A的任何值都是如此,除了零。

    所以你只能说“零不是真的”和“零是零”。这是红宝石的发展方向。

        3
  •  0
  •   Tyler    15 年前

    在某些语言中,只能在“if”语句中使用布尔值。试图检查一个字符串或数字是真是假只是愚蠢和毫无意义的,这样语言就不会让你这么做。

    In Ruby, however, everything can be thought of as a boolean, even though it's really not. 事实上,Ruby中的所有内容实际上都是真的,除了nil和false(IIRC)。这并不意味着nil实际上等于false,正如它并不意味着整数45实际上等于true一样。它们是不同的,分离的,东西。但如果你将nil视为布尔值(即,在if或except中使用它),那么它就好像是假的。

    推荐文章