在Ruby on Rails中对nil v.空v.空白的简要解释

Arr*_*rel 1098 ruby ruby-on-rails

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

  • blank?对象是false,空或空白字符串.例如""," ",nil,[],和{}都是空白.

  • nil? 对象是NilClass的实例.

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

有什么遗漏,或者可以做出更严格的比较吗?

Cor*_*ook 1406

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

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

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

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

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

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false
Run Code Online (Sandbox Code Playgroud)

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

"  ".blank? == true
"  ".empty? == false
Run Code Online (Sandbox Code Playgroud)

Rails也提供 .present?,返回否定.blank?.

数组陷阱:即使数组的所有元素都为空,blank?也会返回.为了确定在这种情况下空白,使用与,例如:falseall?blank?

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
Run Code Online (Sandbox Code Playgroud)

  • 正如问题中提到的,一些非空字符串计为空白. (26认同)
  • 还有:`false.blank?== true` (6认同)
  • 你可以用"礼物"来更新你的答案吗?方法? (4认同)
  • 我会提到`存在'! (2认同)
  • 作为汤姆在他的回答中提到的全空白阵列问题的补充,请注意这可能导致安全问题,攻击者可以使用无准备的代码,只需检查,除非params.nil?或者除非是params.blank ?,并且是目前在Rails中进行大量讨论和工作的原因.有关更多信息,请参见此处:https://github.com/rails/rails/issues/13420 (2认同)

Jul*_*pov 660

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

在此输入图像描述

blank?,present?由Rails提供.

  • 应该注意空白?和礼物?仅限Rails.它们在Ruby 2.0.0中返回Exception:NoMethodError. (55认同)
  • 如果您更新表,请考虑添加`any?`. (17认同)

Sib*_*ang 211

只需扩展朱利安的表格:

在此输入图像描述

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

  • `Enumerable#any?` 是 vanilla Ruby,它不应该列在“rails only”下 (2认同)
  • 它不必与Rails绑定,例如https://github.com/SamSaffron/fast_blank(`require'fast_blank';""..blank?`) (2认同)

Ale*_*ait 62

小建议: !obj.blank? == obj.present?

在某些表达方式中,可以方便/更容易在眼睛上使用

  • @MohamedHafez不,不是.`!! FALSE` (4认同)
  • @Kirk:!! obj相当于!obj.nil? (2认同)

And*_*imm 50

一个不同之处在于.nil?,.empty?它是由编程语言Ruby提供的方法,.blank?而是由Web开发框架Rails 添加的方法.


ste*_*eve 37

在此输入图像描述

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

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

  • 哇!你得到了我的 +1 (2认同)

Ala*_*n H 15

一个特例是在尝试评估布尔值是否为零时:

false.present? == false
false.blank? == true
false.nil? == false
Run Code Online (Sandbox Code Playgroud)

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


dav*_*ron 13

关于这个any?建议的一点注意事项:他是对的,它通常相当于!empty?.但是,any?将返回true一个只有空格(ala " ")的字符串.

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


小智 12

不要忘记any?一般情况!empty?.在Rails我通常检查的东西存在于一个语句的结束if somethingunless something再使用blank?在需要的地方,因为它似乎无处不工作.

  • .任何?不适用于ruby 1.9中的字符串,如.any?需要枚举,而字符串#the本身在ruby 1.9中不起作用. (4认同)
  • 小心"任何?"来检查非空虚.如果你有一个假值数组,它返回false.解决这个问题的方法是传递一个始终为真的块:`[nil,false] .any?{true}`,但是`!empty?`更短,你不记得奇怪的行为. (4认同)

小智 11

nil?是一个标准的Ruby方法,可以在所有对象上调用,true如果对象是nil:

b = nil
b.nil? # => true
Run Code Online (Sandbox Code Playgroud)

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

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false
Run Code Online (Sandbox Code Playgroud)

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

blank?是一个Rails方法,可以在nil对象和空对象上调用.


sha*_*pan 8

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

查看下面的数据指标- 它不言自明,其中包含可用方法中使用的各种数据类型。

#零? #空的? #空白的? #展示?
5 错误的 无方法错误 错误的 真的
”” 错误的 真的 真的 错误的
” “ 错误的 错误的 真的 错误的
“\t\n” 错误的 错误的 真的 错误的
[] 错误的 真的 真的 错误的
[“A”] 错误的 错误的 错误的 真的
{} 错误的 真的 真的 错误的
{a:“b”} 错误的 错误的 错误的 真的
设置新的 错误的 真的 真的 错误的
真的 无方法错误 真的 错误的
真的 错误的 无方法错误 错误的 真的
错误的 错误的 无方法错误 真的 错误的

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


Man*_*ava 6

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

我想添加Ruby On Rails,最好使用obj.blank?obj.present?代替obj.nil?or obj.empty?

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


小智 6

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


mah*_*ich 5

导轨 4

@corban-brook 'Array gotcha : blank?'的替代方案 用于检查数组是否仅包含空值并且可以视为空白?真的:

[ nil, '' ].all? &:blank? == true
Run Code Online (Sandbox Code Playgroud)

还可以这样做:

[nil, '', "", " ",' '].reject(&:blank?).blank? == true
Run Code Online (Sandbox Code Playgroud)


Chi*_*tra 5

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

例如:

example = nil
example.nil?  # true

"".nil?  # false
Run Code Online (Sandbox Code Playgroud)

基本上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
Run Code Online (Sandbox Code Playgroud)

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

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

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