Rails 关于 blank? 和 empty?

zuozuo · 2012年10月12日 · 最后由 fengzhiquxiang 回复于 2012年10月14日 · 4806 次阅读

ruby 中和 rails 中分别定义了empty?blank? 方法,

如果单单从对方法名理解的角度看的话,对只包含一个空格的字符串 a 分别调用两个方法: blank?表示空白,空格是空白,应该返回true; 而empty表示空,也即什么都没有,字符串a中包含有一个空格字符,并不为空,所以应该返回false; 这跟下面程序的执行结果是相一致的。

a = " "      # a 为只包含一个空格的字符串
a.blank?     # =>   true
a.empty?     # =>   false

但是我看了 blank?的源代码之后就犯迷糊了:

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

根据 blank?的源代码来看a.blank?难道不应该返回false的吗?

a.respond_to?(:empty?) ? a.empty? : !a # => false

blank 的设计目的不是这个,是为了统一对全体对象的调用

$ pry -r ./config/environment.rb 
[1] pry(main)> ''.blank?
=> true
[2] pry(main)> nil.blank?
=> true

#1 楼 @fsword 你说的没错,但是怎么解释blank?的运行结果跟其源代码的逻辑不相符的问题的?

在各个类里面又覆盖了

class String
  def blank?
    self !~ /\S/
  end
end

#1 楼 @fsword 嘿嘿,不好意思,上面看的源代码是Object中定义个blank?方法的源代码,String类重定义了blank?

if encoding_aware?
  self !~ /[^[:space:]]/
else
  self !~ NON_WHITESPACE_REGEXP
end

#3 楼 @doitian 嗯,是的,刚发现。

学习到了,呵呵

需要 登录 后方可回复, 如果你还没有账号请 注册新账号