复制.blank?在标准的Ruby中

时间:2011-05-05 17:19:04

标签: ruby

Rails有一个.blank?如果Object为空,将返回true的方法?还是没有?可以找到here的实际代码。当我尝试使用1.9.2来复制它时:

class Object

  def blank?
    respond_to?(:empty?) ? empty? : !self
  end

end

拨打“”.blank?返回true但调用“”.blank?根据{{​​3}}时,返回false。对于.blank,空白字符串应该eval为true?在我查找我最初编写的代码之前:

class Object

  def blank?
    !!self.empty? || !!self.nil?
  end

end

并得到了相同的结果。我错过了什么?

3 个答案:

答案 0 :(得分:13)

你忘掉了这一点 - https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb#L95

class String
  # A string is blank if it's empty or contains whitespaces only:
  #
  #   "".blank?                 # => true
  #   "   ".blank?              # => true
  #   " something here ".blank? # => false
  #
  def blank?
    self !~ /\S/
  end
end

答案 1 :(得分:2)

String类会覆盖Rails实现中Object的{​​{1}}实现:

blank?

答案 2 :(得分:1)

如果字符串只有空格

,则不会被归类为empty?
>> "  ".empty?
=> false

因此,您可能还希望创建

class String
  def blank?
    strip.empty?
  end
end

但仔细考虑一下 - 像这样的猴子修补是危险的,特别是如果其他模块将使用你的代码。