当前位置: 代码迷 >> Ruby/Rails >> Ruby的.nil? .empty? .blank? .present?差异
  详细解决方案

Ruby的.nil? .empty? .blank? .present?差异

热度:646   发布时间:2016-04-29 02:19:37.0
Ruby的.nil? .empty? .blank? .present?区别

.nil? , .empty? .blank? .present?区别:

  • .nil? 和 .empty? 是ruby的方法。 .blank? 是rails的方法。

    ?

  • .nil? 判断对象是否存在(nil)。不存在的对象都是nil的。

    ?

  • .empty? 对象已经存在,判断是否为空字段,比如一个字符串是否为空串,或者一个数组中是否有值

    ?

  • .blank? 相当于同时满足 .nil? 和 .empty? 。railsAPI中的解释是如果对象是:false, empty, 空白字符. 比如说: "", " ", nil , [], 和{}都算是blank。 (object.blank? 相当于 object.nil?||object.empty?)。

    ?

  • present?方法就是blank?方法的相反,判断是否存在,因此present?方法与!blank?方法两者表达的意思是一样的。

?

?

例:.nil?

?

?

1
2
3
4
5
6
nil.nil??????? =>?true
false.nil????? =>?false
1.nil????????? =>?false
0.nil????????? =>?false
"".nil???????? =>?false
[].nil???????? =>?false

?

例:.empty?

?

1
2
3
4
5
"".empty?????????? =>?true
"abc".empty??????? =>?false
[].empty?????????? =>?true
[1,?2,?3].empty??? =>?false
1.empty??????????? => NoMethodError??#说明 empty? 方法不能用于整数

例:.blank?

1
2
3
4
5
6
7
8
9
10
11
p?true.blank?????????FALSE
?p?false.blank???????TRUE
?p?"true".blank??????FALSE
?p?"".blank??????????TRUE
?p?"\n".blank????????TRUE
?p?'\n'.blank????????FALSE
?p?'true'.blank??????FALSE
?p?''.blank??????????TRUE
?p?1.blank???????????FALSE
?p [].blank??????????TRUE
?p [1].blank?????????FALSE

例:.present?

?

1
2
3
4
nil.present??????? =>?false
[].present???????? =>?false
"hello".present??? =>?true
["a"].present????? =>?true

刚开始接触RoR时,我经常将 nil?, empty? blank? 方法混淆,用错. 这导致了当我在调用它们时处理条件判断所遇到的麻烦.

而我之前对PHP, Actionscript的理解对此不仅没有帮助,反而让我变得更困扰. 这些语言的类似方法返回的结果与Ruby确是相反的.

我想通过一些代码的练习,能够加深我对这些相似方法的理解.?

先从nil?方法开始.?

.nil? 方法是对于Ruby中任意对象皆可调用的方法, 用于检测目标对象是否存在,有效. ?在条件分支语句中当你调用一个对象之前

事先对它进行有效性进行判断是很有帮助的. Ruby中, 所有类均继承自Object. ?nil? 是来自于Object的方法, 因此除了特殊情况(

对它的重写, 相信一般也不会这么做), 所有类均会拥有此方法.?

?

为更好理解Ruby是怎样表示一个不存在的对象, 我们需要看一变量 nil. ?在其它的语言中,同样地被记作 NULL或null. 根据语言

对"空"的理解, NULL不会指向任何东西. Ruby恰恰在这点上与这些不同, ?Ruby拥有一个真实存在的类NilClass , 所以nil有其自身的方法,

尽管这在其它语言的角度看来有些不对劲, ?

?

[ruby]?view plaincopy
?
  1. nil.nil???
  2. =>?true??

当我们访问一个不存在的对象,或者正好将一个目标的值赋为nil, 我们会得到一个NilClass的单键实例对象 -- nil. 见下面的几个例子:

?

[ruby]?view plaincopy
?
  1. cool_people?=?{:conan_the_destroyer?=>?"man",?:red_sonja?=>?"woman"}??
  2. ??
  3. cool_people[:george_bush_II]??
  4. =>?nil??
  5. cool_people[:george_bush_II].class??
  6. =>?NilClass??
  7. cool_people[:george_bush_II].nil???
  8. =>?true??
  9. cool_people[:conan_the_destroyer].nil???
  10. =>?false??
  11. ??
  12. test_var?=?nil??
  13. test_var.nil???
  14. =>?true??
  15. ??
  16. [].nil???
  17. =>?false??
  18. ??
  19. "".nil???
  20. =>?false??
  21. ??
  22. 0.nil???
  23. =>?false??
  24. ??
  25. false.nil???
  26. =>?false??




?备注
# 访问不存在hash键值
# 因为对应的key-value是在原hash中存在的, 返回false
# 这个请注意 ?空的对象 ?空数组 或者是 长度为0的字符串 不等于nil.

?

?

?

下面我们来看看 empty??



与nil?方法不同的是, empty? 仅适用于一部分Ruby对象. String类, Hash类,Array类均可以调用该方法. 当对象调用它时, 会判断该目标是否拥有非空的值, 返回逻辑值true或false.?

[ruby]?view plaincopy
?
  1. ["Larry",?"Curly",?"Moe"].empty???
  2. =>?false??
  3. ??
  4. ??
  5. [""].empty???
  6. =>?false??
  7. ??
  8. ??
  9. [].empty???
  10. =>?true??
  11. ??
  12. ??
  13. {}.empty???
  14. =>?true??
  15. ??
  16. ??
  17. "".empty???
  18. =>?true??
  19. ??
  20. ??
  21. 0.empty???
  22. =>?NoMethodError:?undefined?method?`empty?'?for?0:Fixnum??
  23. ??
  24. ??
  25. test_var2?=?nil??
  26. test_var2.empty???
  27. =?>?NoMethodError:?undefined?method?`empty?'?for?nil:NilClass??





上面的最后一个例子能够说明当们如此操作时会有什么样结果 (0 0 )
dog = {:name => "Beauregard"}
puts "What kind?" if dog[:breed].empty?
=> NoMethodError: undefined method `empty?' for nil:NilClass


# Use nil? instead.
puts "What kind?" if dog[:breed].nil?
=> What kind?
备注: 因为 dog[:breed] 不存在得到nil, 而nil应该用 nil.nil? 的方式去判断 非 .empty??

?

?

?

Rails中会常用到的blank? 方法

?

blank?方法是Rails而非Ruby中的方法. ?基本上它实现了nil? empty?的作用. ?下面是来自Rails API文档中的介绍:?
“An object is blank if it‘s false, empty, or a whitespace string. ?
For example, "", " ", nil, [], and {} are blank.”
举例来说, 我经常会在模型中赋值的场景调用blank?方法. ?回想之前的例子-- dog哈希表, 我们可以这样来简化检验值

[ruby]?view plaincopy
?
  1. script/console?>>??
  2. ??
  3. ??
  4. dog?=?{:name?=>?"Beauregard"}??
  5. puts?"What?kind?"?if?dog[:breed].blank???
  6. =>?What?kind???
  7. ??
  8. ??
  9. dog?=?{:name?=>?"Beauregard",?:breed?=>?""}??
  10. puts?"What?kind?"?if?dog[:breed].blank???
  11. =>?What?kind???






可以看到 .blank? 的结果 相当于 .ni? ?+ ? .empty?

?

  相关解决方案