如何在Ruby中理解nil vs. empty vs. blank

问题描述 投票:1128回答:14

[我发现自己反复寻找Ruby on Rails中nil?blank?empty?的区别的清晰定义。这是我最近来过的:

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

  • nil?对象是NilClass的实例。

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

是否缺少任何内容,或者可以进行更严格的比较?

ruby-on-rails ruby
14个回答
1436
投票

[.nil?可以在任何对象上使用,如果对象为nil,则为true。

.empty?可用于字符串,数组和哈希,如果满足以下条件,则返回true:

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

在零值上运行.empty?将抛出NoMethodError

.blank?的输入。它是implemented by Rails,将对任何对象进行操作,并且像.empty?一样在字符串,数组和哈希上工作。

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

[.blank?还对非空但仅包含空格的字符串求值为true:

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

[Rails also provides .present?,返回.blank?的否定。

数组陷阱:blank?将返回false,即使数组的所有元素为空。要确定这种情况下的空白,请使用all?blank?,例如:

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

674
投票

我在所有情况下都制作了这个有用的表:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9vWHVoSi5wbmcifQ==” alt =“在此处输入图像描述”>

[blank?present?由Rails提供。


215
投票

只需扩展朱利安的表:

enter image description here

参考:empty?blank?nil?傻傻分不清楚


63
投票

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

在某些表达式中可以方便/轻松地进入眼睛


52
投票

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


49
投票

enter image description here

  • nil?的全部是blank?
  • empty?的全部是blank?
  • empty?都不是nil?
  • nil?都不是empty?

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


16
投票

[一种特殊情况是当尝试评估布尔值是否为零时:

false.present? == false
false.blank? == true
false.nil? == false

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


14
投票

关于any?建议的一点说明:他是对的,它[[通常等同于!empty?。但是,any?会将true返回到仅包含空格的字符串(ala " ")。

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

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

12
投票
[nil?是可以在所有对象上调用的标准Ruby方法,如果对象是true,则返回nil:]

b = nil b.nil? # => true

[empty?是一个标准的Ruby方法,可以在某些对象(例如字符串,数组和哈希)上调用,如果这些对象不包含任何元素,则返回true

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

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

[blank?是一种Rails方法,可以在nil对象以及空对象上调用。


7
投票
其他人都很好地解释了区别。

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

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


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

4
投票
Rails 4

3
投票
nil?可以在任何对象上使用。它确定对象是否具有任何值,包括“空白”值。
© www.soinside.com 2019 - 2024. All rights reserved.