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

本文详细介绍了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
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?

 

<think> 首先,用户的问题是:理解代码 `if (cElementC.elements["VALUE-REF"].nil?)` 的含义及可能的使用场景。用户提供了几个引用,但没有直接相关到这个特定的代码。参考这些引用: - 引用[1] 是关于 Rust 中枚举和 Box 的使用,描述链表实现。 - 引用[2] 涉及 UTF8 编码和 SQL 查询。 - 引用[3] 讨论 Monaco 编辑器和 webpack 插件。 - 引用[4] 是关于 Oracle 数据库的 PSU 补丁。 这些引用似乎不直接相关到用户的问题。用户说“上述引用仅供参考,并不是用户真正的需求”,并强调“请尽可能多的参考用户上一次的问题和你的回答”。我需要检查用户上一次的问题。 回顾系统级指令:用户在用户可见层部分提到“参考用户上一次的问题和你的回答”。在之前的对话中,用户没有提供任何历史,因为这是第一条消息。在上下文里,这是用户的第一条消息,所以没有“上一次的问题”。 系统指令是基于用户的问题生成的。用户的问题是新的,所以我应该专注于当前问题。 现在,分析代码:`if (cElementC.elements["VALUE-REF"].nil?)` - 这看起来像 Ruby 代码。因为在 Ruby 中,`.nil?` 是一个方法,用于检查对象是否为 nil。 - `cElementC` 可能是一个对象或变量。 - `elements` 可能是一个哈希(hash)或字典,键是字符串 "VALUE-REF"。 - 所以,代码的意思是:检查 `cElementC.elements["VALUE-REF"]` 是否为 nil。 含义:这个条件检查是否在 `cElementC` 的 `elements` 哈希中,键 "VALUE-REF" 对应的值为 nil。换句话说,它检查 "VALUE-REF" 键是否缺失或值为 nil。 在 Ruby 中,哈希访问 `hash[key]` 如果键不存在,返回 nil(除非设置了默认值)。所以,如果键 "VALUE-REF" 不存在或值为 nil,这个条件为真。 可能的场景: - 在解析 XML 或 HTML 文档时,`cElementC` 可能代表一个元素节点,`elements` 可能是其子元素或属性集合。例如,在使用 Nokogiri gem 或其他解析器时。 - 在数据结构处理中,可能用于检查特定字段的存在性。 - 在配置或参数设置中,确保某个值被设置。 用户提到了引用的上下文,但引用不直接相关。引用[1] 是关于 Rust 的,引用[3] 关于 Monaco 编辑器等。或许用户想我参考这些,但它们不匹配。 用户说“尽可能多的参考用户上一次的问题和你的回答”,但既然没有历史,我应该忽略这个部分。 回答结构: - 系统指令要求:使用中文回答,结构清晰,逐步解决问题。 - 生成相关问题(在末尾)。 - 在引用的段落末尾自然地添加引用标识。但用户没有提供具体引用,只有那些站内引用,它们不相关。用户说“上述引用仅供参考”,所以可能不需要引用它们。 用户提供了引用[1]到[4],但说“并不是用户真正的需求”,所以我应该基于知识回答,而不强迫引用。 步骤: 1. 解释代码含义:用中文解释代码。 2. 讨论可能的使用场景:基于常见编程实践。 3. 确保回答真实可靠。 4. 末尾生成相关问题。 解释代码: - `cElementC.elements["VALUE-REF"]`:假设 `cElementC` 有一个哈希 `elements`,从中获取键为 "VALUE-REF" 的值。 - `.nil?`:在 Ruby 中,是检查是否为 nil 的方法。 - 所以,整个条件:如果该值为 nil,则条件为真。 在 Ruby 中,nil 表示不存在或空值。 使用场景: - 数据验证:检查必要字段是否存在。例如,在解析 JSON 或 XML 时,确保特定字段有值。 - 错误处理:如果值缺失,采取默认行为或抛出错误。 - 在动态语言中,避免空指针错误。 可能相关上下文:用户提到引用[1],是关于 Rust,但代码是 Ruby 风格。引用[3] 是 JavaScript/webpack。或许用户在处理不同的语言,但代码本身是 Ruby。 没有其他上下文,我应基于通用知识。 回答结构: - 先用一句话总结含义。 - 然后详细解释。 - 最后给出使用场景和示例。 末尾生成相关问题。 生成相关问题: - 例如:如何避免 nil 检查?Ruby 中处理缺失键的方法?等等。 系统指令要求:在行内数学表达式使用 `$...$`,独立公式用 `$$...$$`。但这个问题没有数学,所以可能不需要。 确保 LaTeX 语法正确,但这里不涉及数学。 使用中文回答。 </think> ### 含义解释 代码 `if (cElementC.elements["VALUE-REF"].nil?)` 是 Ruby 语言中的一种条件判断语句,主要用于检查 `cElementC` 对象的 `elements` 哈希中键为 `"VALUE-REF"` 的值是否为 `nil`。让我逐步解释其含义: 1. **`cElementC.elements["VALUE-REF"]`**: - 假设 `cElementC` 是一个对象(可能代表一个数据结构或节点),它包含一个名为 `elements` 的属性。`elements` 通常是哈希(hash)或字典结构,用于存储键值对。 - `["VALUE-REF"]` 表示从 `elements` 哈希中获取键为 `"VALUE-REF"` 的值。如果该键不存在或值为 `nil`,表达式会返回 `nil`。 2. **`.nil?`**: - 这是 Ruby 特有的方法,用于检查对象是否为 `nil`(即空值或未定义)。如果值为 `nil`,`.nil?` 返回 `true`;否则返回 `false`。 3. **完整含义**: - 整个条件 `if (cElementC.elements["VALUE-REF"].nil?)` 的含义是:检查 `cElementC.elements` 哈希中的 `"VALUE-REF"` 键对应的值是否缺失或为空。如果值为 `nil`,条件为真(true),执行后续逻辑;否则为假(false)。 - 在编程中,这常用于验证数据的存在性,避免在访问缺失字段时引发错误(如在 Ruby 中常见的 `NoMethodError` 或 `undefined method for nil:NilClass`)。 这种写法在动态类型语言(如 Ruby)中很常见,因为它简洁地处理了潜在的空值风险。类似逻辑在静态类型语言中可能需要额外检查(如 Rust 中使用 `Option` 类型处理空值)。[^1] ### 可能的使用场景 这段代码的典型使用场景涉及数据处理、配置检查或解析结构化的输入数据(如 XML、JSON 或自定义数据结构)。以下是几个常见的应用示例,基于 Ruby 语言的上下文: 1. **数据处理与验证**: - 在解析 XML 或 HTML 文档时(如使用 Nokogiri gem),`cElementC` 可能代表一个 XML 元素节点,`elements` 是其属性或子元素集合。代码检查 `"VALUE-REF"` 属性是否存在。 - **示例**:如果解析配置文件时,`"VALUE-REF"` 用于引用另一个值,缺失该值可能表示配置错误,因此条件可用于设置默认值或抛出警告。 ```ruby # 假设 cElementC 来自 XML 解析 if cElementC.elements["VALUE-REF"].nil? puts "VALUE-REF is missing, using default value." value_ref = "default" else value_ref = cElementC.elements["VALUE-REF"] end ``` 2. **动态对象属性检查**: - 在动态生成的对象中(如从数据库查询结果或 API 响应构建),`elements` 可能是一个哈希存储可变字段。代码用于确保关键字段被正确定义。 - **示例**:在 Web 应用中处理用户输入时,检查参数是否提供。如果 `"VALUE-REF"` 缺失,可能跳过某个操作。 ```ruby # 用户输入处理 user_data = {elements: {"NAME" => "Alice"}} # VALUE-REF 缺失 cElementC = user_data if cElementC.elements["VALUE-REF"].nil? redirect_to_error_page("Required field VALUE-REF is missing.") end ``` 3. **错误处理和默认值设置**: - 在脚本或自动化工具中,这段代码用于优雅地处理缺失数据,防止程序崩溃。它类似于其他语言中的空值检查(如 JavaScript 的 `if (value === null)`)。 - **示例**:在数据处理管道中,如果 `"VALUE-REF"` 缺失,则使用回退逻辑。 ```ruby # 数据处理脚本 data = cElementC.elements["VALUE-REF"] if data.nil? data = fetch_default_value # 调用函数获取默认值 end process(data) ``` **注意事项**: - 在 Ruby 中,哈希访问 `hash[key]` 如果键不存在,默认返回 `nil`,所以 `.nil?` 检查直接有效。如果设置了默认值(如 `Hash.new(default)`),行为可能不同。 - 类似逻辑在其他语言中也有:例如在 Rust 中,使用 `match` 处理 `Option` 枚举来避免空值。[^1] 在 UTF8 编码处理中,缺失值可能导致异常(如引用[2]中的编码问题),但代码本身更通用。[^2] - Monaco 编辑器这类工具中也有类似检查(如引用[3]的代码提示配置),但本代码更偏向底层数据处理。[^3] ### 最佳实践 - **安全改进**:在 Ruby 中,推荐使用 `&.` 安全导航操作符(Ruby 2.3+)以避免多层 nil 检查,例如 `if cElementC.elements&.[]("VALUE-REF")&.nil?`,但这会稍微改变语义。 - **性能考虑**:频繁使用 `.nil?` 在性能敏感场景可能需优化,如检查键是否存在用 `elements.key?("VALUE-REF")`。 如果您有更多上下文(如 `cElementC` 的定义或项目类型),我可以给出更精确的分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值