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

Arrel 1029 ruby ruby-on-rails

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

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

  • nil? 对象是NilClass的实例.

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

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

Corban Brook.. 1344

.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

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

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

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

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

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

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

Julian Popov.. 629

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

在此输入图像描述

blank?,present?由Rails提供.

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

Sibevin Wang.. 194

只需扩展朱利安的表格:

在此输入图像描述

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

  • 它不必与Rails绑定,例如https://github.com/SamSaffron/fast_blank(`require'fast_blank';""..blank?`) (2认同)

Alexander Ma.. 57

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

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

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

Andrew Grimm.. 47

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


steve.. 22

在此输入图像描述

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

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


Alan H.. 12

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

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

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


用户甲.. 9

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

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

davemyron.. 9

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

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


用户甲.. 8

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对象和空对象上调用.


提问时间:

查看次数:

286823 次

最近活跃:

1 年,2 月 前