复制.blank? 在标准的Ruby中

Duplicating .blank? in standard Ruby

Rails有一个.blank? 如果Object为空,将返回true的方法? 还是没有? 可以在此处找到实际的代码。 当我尝试1.9.2通过执行以下操作来复制它:

1
2
3
4
5
6
7
class Object

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

end

调用".blank?返回true但调用".blank?返回false,根据rails文档,空格字符串应该为.blank eval为true?在我查找我最初编写的代码之前:

1
2
3
4
5
6
7
class Object

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

end

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


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

1
2
3
4
5
6
7
8
9
10
11
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


String类覆盖Rails实现中blank?Object实现:

1
2
3
4
5
6
7
8
class String

  def blank?
    # Blank if this String is not composed of characters other than whitespace.
    self !~ /\S/
  end

end


如果字符串只有空格,则不会被归类为empty?

1
2
>>" ".empty?
=> false

因此,您可能还希望创建

1
2
3
4
5
class String
  def blank?
    strip.empty?
  end
end

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