美文网首页程序员
Rails的blank?不只是为了方便处理string空白.md

Rails的blank?不只是为了方便处理string空白.md

作者: CbdFocus | 来源:发表于2016-03-24 15:04 被阅读168次

    参见Rails源码:

    rails/activesupport/lib/active_support/core_ext/object/blank.rb

    原以为『blank?』只是为了处理string空白时比『empty?』更方便,其实还有一层,统一了各种对象对『是否存在』的表现。
    有点儿疑惑的是,Ruby支持打开类真的好吗?莫名的担心~~

    class Object
      # An object is blank if it's false, empty, or a whitespace string.
      # For example, +false+, '', '   ', +nil+, [], and {} are all blank.
      #
      # This simplifies
      #
      #   !address || address.empty?
      #
      # to
      #
      #   address.blank?
      #
      # @return [true, false]
      def blank?
        respond_to?(:empty?) ? !!empty? : !self
      end
    
      # An object is present if it's not blank.
      #
      # @return [true, false]
      def present?
        !blank?
      end
    
      # Returns the receiver if it's present otherwise returns +nil+.
      # <tt>object.presence</tt> is equivalent to
      #
      #    object.present? ? object : nil
      #
      # For example, something like
      #
      #   state   = params[:state]   if params[:state].present?
      #   country = params[:country] if params[:country].present?
      #   region  = state || country || 'US'
      #
      # becomes
      #
      #   region = params[:state].presence || params[:country].presence || 'US'
      #
      # @return [Object]
      def presence
        self if present?
      end
    end
    
    class NilClass
      # +nil+ is blank:
      #
      #   nil.blank? # => true
      #
      # @return [true]
      def blank?
        true
      end
    end
    
    class FalseClass
      # +false+ is blank:
      #
      #   false.blank? # => true
      #
      # @return [true]
      def blank?
        true
      end
    end
    
    class TrueClass
      # +true+ is not blank:
      #
      #   true.blank? # => false
      #
      # @return [false]
      def blank?
        false
      end
    end
    
    class Array
      # An array is blank if it's empty:
      #
      #   [].blank?      # => true
      #   [1,2,3].blank? # => false
      #
      # @return [true, false]
      alias_method :blank?, :empty?
    end
    
    class Hash
      # A hash is blank if it's empty:
      #
      #   {}.blank?                # => true
      #   { key: 'value' }.blank?  # => false
      #
      # @return [true, false]
      alias_method :blank?, :empty?
    end
    
    class String
      BLANK_RE = /\A[[:space:]]*\z/
    
      # A string is blank if it's empty or contains whitespaces only:
      #
      #   ''.blank?       # => true
      #   '   '.blank?    # => true
      #   "\t\n\r".blank? # => true
      #   ' blah '.blank? # => false
      #
      # Unicode whitespace is supported:
      #
      #   "\u00a0".blank? # => true
      #
      # @return [true, false]
      def blank?
        BLANK_RE === self
      end
    end
    
    class Numeric #:nodoc:
      # No number is blank:
      #
      #   1.blank? # => false
      #   0.blank? # => false
      #
      # @return [false]
      def blank?
        false
      end
    end
    
    class Time #:nodoc:
      # No Time is blank:
      #
      #   Time.now.blank? # => false
      #
      # @return [false]
      def blank?
        false
      end
    end
    

    相关文章

      网友评论

        本文标题:Rails的blank?不只是为了方便处理string空白.md

        本文链接:https://www.haomeiwen.com/subject/vgerlttx.html