`

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
[123].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 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?

 

分享到:
评论

相关推荐

    二元树

    在Ruby编程语言中,实现二元树可以为各种问题提供高效的解决方案。 二元树的特性: 1. 深度:树的最大层数称为深度,根节点的深度为0。 2. 高度:从根节点到最远叶子节点的最长路径上的边数称为高度。 3. 完全二元...

    linked_list:Ruby中的链表实现

    在Ruby编程语言中,链表是一种非常基础且重要的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。链表不同于数组,数组中的元素在内存中是连续存储的,而链表的节点可以分散在内存的任何位置...

    true_string:将字符串转换为布尔值

    真字符串 可以转换为真值、 true和false的字符串集合。 "true" . truthy? "false" ....nil . falsy? 如果接收者分别为真或假,这些方法将返回true 。 安装 将此行添加到应用程序的 Gemfile 中: gem

    ruby-2.3.7.tar.gz

    Ruby是一种强大的、面向对象的脚本语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年设计并开发。它强调代码的可读性和简洁性,鼓励使用自然语言般的语法,使得程序员能更快速地编写出清晰易懂的代码。在描述中...

    EasyUIImagePickerController

    strongSelf.presentViewController(imagePickerController, animated: true, completion: nil) } }, Fail: { //SVProgressHUD.showErrorWithStatus("无法获取照片权限") }) 选取图片来自相机 注意使用[weak ...

    binary_search_tree:用Ruby实现的二进制搜索树

    在Ruby中实现二叉搜索树,我们需要定义一个类来表示节点,这个节点应包含键、值以及左右子节点的引用。接着,我们需要定义一系列方法来执行常见的操作,如插入节点、查找节点、删除节点等。 ```ruby class Node ...

    Rails的邮件预览引擎MailsViewer.zip

    user_name: nil, password: nil, authentication: nil, enable_starttls_auto: true }, send_if: lambda { |mail| mail.destinations.select { |address| ["yedingding@gmail.com"].include?(address) }.any? ...

    es-query-builder:Ruby 中 Elasticsearch 的查询构建器

    Ruby 中 Elasticsearch 的查询构建器。 用法 gem 'es-query-builder' builder = EsQueryBuilder . new ( # Fields allowed searching with match query. query_fields : [ 'field1' ] , # Fields for ...

    is_bullshit:叫废话

    is_bullshit叫废话。... 以下值为合格的总废话: [nil, [], {}, 0, false, 'undefined', 'false', '', '0', 'nil', 'null'] .legit? 和.seems_legit? .bullshit?的对立是.bullshit? nil.bullshit?

    Ruby-GraphQL的ActionPolicy集成

    在Ruby开发中,GraphQL是一种强大的查询语言,用于API,它允许客户端定义他们想要的数据结构,而服务器则返回匹配请求的数据。ActionPolicy则是Ruby中的一个授权库,它为Rails应用提供了基于对象的策略模式实现,...

    UITextField

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector...

    ios-地理编码.zip

    .first, error == nil { let coordinate = placemark.location!.coordinate print("经度: \(coordinate.longitude), 纬度: \(coordinate.latitude)") } else { print("地理编码失败: \(error?....

    ipcat-ruby:client9ipcat的Ruby端口

    ipcat-ruby 库的ruby端口,用于对来自已知数据中心的IP地址进行分类 安装 使用捆绑器: # In Gemfile gem 'ipcat' 或与Ruby: gem install ipcat 用法 IPCat . datacenter? ( ip_address ) 如果ip_address来自...

    weak_attr_accessor:RubyMotion 的weak_attr_accessor

    #weak_attr_accessor 用于 ... @view_controller = nil else @view_controller = WeakRef . new ( obj ) end end end 安装 将此添加到您的Gemfile : gem 'weak_attr_accessor' 运行bundle install 执照

    ruby-2.5.8.tar.gz

    Ruby是一种面向对象、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年设计并开发。Ruby以其简洁、优雅的语法和强大的元编程能力而闻名,它强调程序员的生产力和代码的可读性。在Ruby-2.5.8版本中...

    in_business:用于检查给定的DateTime,Date或Time是否在预定义的开放时间范围内的gem

    在业务 处理业务开放时间非常困难,或者至少要为每个应用程序写很多工作。... # => nil (since we've not set any hours yet!) # We want to be open 9am til 6pm on a Monday InBusiness . hours . monday

    AutomaticCoder.zip

    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSDictionary *json = [data objectFromJSONData]; //init object Person *person = [[Person alloc] ...

    ruby ftp封装实例详解

    ### Ruby FTP 封装实例详解 #### 概述 在Ruby开发中,有时我们需要与FTP服务器进行交互,比如上传或下载文件等操作。虽然Ruby的标准库`Net::FTP`已经提供了一些基本的功能,但在实际应用中,我们往往需要对这些...

    Ruby Sheet.pdf

    ### Ruby 语言基础知识点概述 本篇文档将详细介绍Ruby速查手册中提到的关键知识点,包括预定义变量、保留字、类型、表达式、模块/类定义以及运算符和正则表达式的使用方法。 #### 预定义变量 Ruby提供了一系列...

    Ruby语言入门教程&代码示例.pdf

    ### Ruby语言基础知识与示例详解 #### 一、Ruby简介 Ruby是一种面向对象的脚本语言,具有简单、高效的特点。它由日本人松本行弘(Yukihiro Matsumoto)于1995年设计并发布。Ruby的设计哲学强调程序员的生产力和...

Global site tag (gtag.js) - Google Analytics