Did you know that you can navigate the posts by swiping left and right?

理解Ruby中的True

2016-05-29 . 编程 . 评论
#Effective Ruby

  1. 在其他语言中,0一般表示false;在Ruby中,0表示的是True。

    对于Ruby语言的布尔值,其实非常简单:

    除了false和nil,其他值都是真值。

    任何对象非false,非nil,该对象一定是真值。

    再记录点其他内容:

    • nil? : 只有一种情况为真:
    nil.nil? 	#=> true
    
    • empty?: 除了nil的对象以外,还有Array,Hash,String(,Set,Queue)等类:
    nil.empty? 	#=> true
    [].empty? 	#=> true
    {}.empty? 	#=> true
    "".empty? 	#=> true
    
    • blank?:这个是rails中的方法。这个比empty?多了一种为true的情况:
    nil.blank? 	#=> true
    [].blank? 	#=> true
    {}.blank? 	#=> true
    "".blank?	#=> true
    " ".blank? 	#=> true
    
    • present?:这个也是rails的方法。运行结果正好与blank?相反,即:sth.present? 等于 !sth.blank?
    nil.present? 	#=> false
    [].present? 	#=> false
    {}.present? 	#=> false
    "".present?		#=> false
    " ".present? 	#=> false
    
  2. 在其他语言中,true和false作为关键字存在;在Ruby中,true和false是全局变量,引用书中的一句话:

    true和false被描述为不遵循命名和赋值规范的全局变量。

    这句话可以分为两点理解:

    • true和false表示的全局变量,并没有以$符号开头。

    • true和false表示的全局变量,不能被赋值。

    可以通过以下语句验证:

    true.class 		# => TrueClass
    false.class		# => FalseClass
    
  3. 将false作为 “==” 的左操作符

    因为false放在左边时,其实执行的是 FalseClass#==

    而放在右边的时候,如果左边是一个Object,那么实际上执行的是 Object#==

    这样看起来,感觉不到两者的区别所在

    书上举了这样的一个例子,很好地说明了两者的区别

    class Bad
      def == other
        true
      end
    end
    
    false == Bad.new 
    #=> false
    
    Bad.new == false 
    #=> true
    

    很容易理解,对于Bad类来说 == 方法,被重写了,任何情况都返回 true。

    所以为了得到正确的结果,建议将false写在 == 符号的左边。