Ruby的.nil? .empty? .blank? .present?区别

2 篇文章 0 订阅
2 篇文章 0 订阅

.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
true .blank?         FALSE
  false .blank?       TRUE
  "true" .blank?      FALSE
  "" .blank?          TRUE
  "\n" .blank?        TRUE
  '\n' .blank?        FALSE
  'true' .blank?      FALSE
  '' .blank?          TRUE
  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 plain copy
 
  1. nil.nil?  
  2. => true  

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

 

[ruby]  view plain copy
 
  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 plain copy
 
  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 plain copy
 
  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?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值