在Ruby on Rails中对 nil v. empty v. blank的简要解释

A concise explanation of nil v. empty v. blank in Ruby on Rails

我发现自己不断地在寻找一个清晰的定义,即nil?blank?empty?在ruby on rails中的区别。这是我最近的一次:

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

  • nil?对象是nilclass的实例。

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

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


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

.empty?可用于字符串、数组和哈希,并在以下情况下返回true:

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

在零的东西上运行.empty?会抛出NoMethodError

这就是.blank?的来历。它是由Rails实现的,可以在任何对象上操作,也可以在字符串、数组和散列上像.empty?那样工作。

1
2
3
4
5
6
7
nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

对于非空但仅包含空白的字符串,.blank?的计算结果也为真:

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

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

array gotcha:blank?将返回false,即使数组的所有元素都为空。在这种情况下,使用all?blank?来确定空白,例如:

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


我用所有的箱子做了这个有用的桌子:

enter image description here

blank?present?由轨道提供。


扩展朱利安的桌子:

enter image description here

裁判:空的?空白?零?傻傻分不清楚


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

在某些表达方式中,对眼睛来说很方便


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


enter image description here

  • 以东的一切都是以东的。
  • 所有的东西都是
  • empty?不是nil?
  • nil?不是empty?

tl;dr——只使用blank?present?,除非你想区分""" "


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

1
2
3
false.present? == false
false.blank? == true
false.nil? == false

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


关于any?的建议,只需注意一点:他说的对,它一般等同于!empty?。但是,any?会将true返回到一系列纯空白(ala "")。

当然,请参见上面的1.9注释。


别忘了any?,一般是!empty?。在Rails中,我通常在与if somethingunless something的语句末尾检查是否存在某些内容,然后根据需要使用blank?,因为它似乎在任何地方都可以工作。


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

1
2
b = nil
b.nil? # => true

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

1
2
3
4
5
a = []
a.empty? # => true

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

不能对nil对象调用empty?

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


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

我想添加RubyonRails,最好使用obj.blank?obj.present?,而不是obj.nil?obj.empty?

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


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


钢轨4

@corban brook's'数组的另一个选择是:空白?'用于检查数组是否只包含空值并且可以视为空?真实:

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

也可以这样做:

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

nil?可用于任何物体。它确定对象是否有任何值,包括"空白"值。

例如:

1
2
3
4
example = nil
example.nil?  # true

"".nil?  # false

基本上,只有当对象实际上等于"零"时,nil?才会返回"真"。

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

例如:

1
2
3
4
5
6
7
8
"".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?的组合,它对检查假定为集合的对象很有用,但也可以为零。