if(!x) vs if(x==false) in ruby

前端 未结 3 1394
借酒劲吻你
借酒劲吻你 2020-12-16 15:15

I don\'t understand the following code:

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


        
3条回答
  •  北海茫月
    2020-12-16 15:57

    Ruby considers that false and nil are the only two "falsy" values, while everything else is "truthy". This is by definition and can not be modified (at least in MRI). This definition is used for all builtin operators like if, unless, while, until, cond ? if_truthy : if_falsey, ||, &&, ...

    Writing foo == bar will always call the == method on foo with bar as an argument. By default, nil, false, true and all other immediates like symbols, etc..., are only equal to themselves. This could be changed, though:

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

    In Ruby 1.9, you can also redefine the operator !, so unless foo is not necessarily the same as if !foo or the contrary of if foo:

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

    Not that anybody would recommend doing anything like this...

提交回复
热议问题