如何理解Ruby中的nil vs.空vs.空白

我发现自己反复寻找Ruby on Rails中nil?blank?empty?差异的明确定义。这是我最接近的:

  • blank?对象为false、空或空格字符串。例如,""" "nil[]{}为空。

  • nil?对象是NilClass的实例。

  • empty?对象是类特定的,定义因类而异。如果字符串没有字符,则为空,如果数组不包含任何项目,则为空。

有没有遗漏什么,或者可以进行更严格的比较?

325091 次浏览

一个区别是.nil?.empty?是由编程语言Ruby提供的方法,而.blank?是由Web开发框架Rails提供的添加

不要忘记any?,它通常是!empty?。在Rails中,我通常用if somethingunless something检查语句末尾是否存在某些内容,然后在需要的地方使用blank?,因为它似乎在任何地方都有效。

.nil?可以用于任何对象,如果对象为nil,则为true。

.empty?可以用于字符串、数组和哈希,如果:

  • 字符串长度==0
  • 数组长度==0
  • 哈希长度==0

在nil上运行.empty?会抛出NoMethodError

这就是.blank?的用武之地。它是由Rails实现,可以对任何对象进行操作,也可以像.empty?一样对字符串、数组和哈希进行操作。

nil.blank? == truefalse.blank? == true[].blank? == true{}.blank? == true"".blank? == true5.blank? == false0.blank? == false

.blank?还在非空但仅包含空格的字符串上计算true:

"  ".blank? == true"  ".empty? == false

Rails还提供.present?,返回.blank?的否定。

数组问题:即使数组的所有元素都是空白,blank?也会返回false。要确定这种情况下的空白,请使用all?blank?,例如:

[ nil, '' ].blank? == false[ nil, '' ].all? &:blank? == true

关于any?建议的一点说明:他是对的,它的一般等效于!empty?。然而,any?将返回true到一串空白(ala" ")。

当然,也请参阅上面的1.9评论。

快速提示:!obj.blank? == obj.present?

在某些表情中可以方便/更容易对眼睛

一个特殊情况是当尝试评估布尔值是否为nil时:

false.present? == falsefalse.blank? == truefalse.nil? == false

在这种情况下,建议使用.nil?

我用所有的案例制作了这个有用的表格:

输入图片描述

blank?present?由Rails提供。

扩展朱利安的表:

在此处输入图像描述

参考:空?空?空?傻傻分不清楚

nil?是一个标准的Ruby方法,可以对所有对象调用,如果对象是nil,则返回true

b = nilb.nil? # => true

empty?是一个标准的Ruby方法,可以在一些对象上调用,例如Strings、数组和哈希,如果这些对象不包含元素,则返回true

a = []a.empty? # => true
b = ["2","4"]b.empty? # => false

empty?不能在nil对象上调用。

blank?是一个Rails方法,可以对nil对象以及空对象调用。

其他人都很好地解释了区别是什么。

我想添加在Ruby On Rails中,最好使用obj.blank?obj.present?而不是obj.nil?obj.empty?

obj.blank?处理所有类型nil''[]{},如果值不可用则返回true,如果值在任何类型的对象上都可用则返回false

Rails 4

@corban-brook的“数组明白了:空白?”的替代方案,用于检查数组是否仅包含空值并且可以被视为空白?true:

[ nil, '' ].all? &:blank? == true

也可以这样做:

[nil, '', "", " ",' '].reject(&:blank?).blank? == true

nil?可以用于任何对象。它确定对象是否有任何值,包括“空白”值。

例如:

example = nilexample.nil?  # true
"".nil?  # false

基本上,只有当对象实际上等于“nil”时,nil?才会返回true。

empty?仅对被视为集合的对象调用。这包括字符串(字符集合)、哈希(键/值对集合)和数组(任意对象集合)等内容。empty?返回true,如果集合中没有项目。

例如:

"".empty? # true"hi".empty?   # false{}.empty?  # true{"" => ""}.empty?   # false[].empty?   # true[nil].empty?  # false
nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass

请注意,不能对nil对象调用empty?,因为nil对象不是集合,它会引发异常。

另请注意,即使集合中的项为空,也不意味着集合为空。

blank?基本上是nil?empty?的组合,它对于检查您认为是集合的对象很有用,但也可能是nil。

exists?方法可用于检查数据是否存在于数据库中。它返回布尔值truefalse

在此处输入图片描述

  • nil?的一切都是blank?
  • empty?的一切都是blank?
  • 没有什么是empty?就是nil?
  • 没有什么是nil?就是empty?

tl; dr--除非您想区分""" ",否则仅使用blank?present?

虽然这个问题有n个答案,但我喜欢这里解释的方式,所以又发布了一个答案:-)

看下面的数据指标-它与跨可用方法使用的各种数据类型不言而喻。

理解功能的度量方法

参考:https://blog.appsignal.com/2018/09/11/differences-between-nil-empty-blank-and-present.html