提问人:Arrel 提问时间:5/20/2009 最后编辑:the Tin ManArrel 更新时间:5/17/2023 访问量:330731
如何在 Ruby 中理解 nil vs. empty vs. blank
How to understand nil vs. empty vs. blank in Ruby
问:
我发现自己在 Ruby on Rails 中反复寻找 、 和 的区别的明确定义。这是我最接近的:nil?
blank?
empty?
blank?
对象为 false、空或空格字符串。例如,、、、和为空。""
" "
nil
[]
{}
nil?
对象是 NilClass 的实例。empty?
对象是特定于类的,并且定义因类而异。如果字符串没有字符,则字符串为空,如果数组不包含任何项,则为空。
是否遗漏了什么,或者可以进行更紧密的比较?
答:
一个区别是 和 是由编程语言 Ruby 提供的方法,而是由 Web 开发框架 Rails 添加的方法。.nil?
.empty?
.blank?
别忘了哪个一般是.在 Rails 中,我通常会检查语句末尾是否存在某些内容,然后在需要时使用,因为它似乎在任何地方都有效。any?
!empty?
if something
unless something
blank?
评论
any?
[nil, false].any?{ true }
!empty?
.nil?
可以在任何对象上使用,如果对象为 nil,则为 true。
.empty?
可用于字符串、数组和哈希,如果出现以下情况,则返回 true:
- 字符串长度 == 0
- 数组长度 == 0
- 哈希长度 == 0
在 nil 的东西上运行会抛出一个 ..empty?
NoMethodError
这就是用武之地。它由 Rails 实现,可以对任何对象进行操作,也可以像对字符串、数组和哈希值一样工作。.blank?
.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?
false
all?
blank?
[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true
评论
false.blank? == true
blank?
require 'active_support/core_ext/object/blank'
关于建议的一点说明:他是对的,它通常等同于 .但是,将返回到一个只有空格的字符串 (ala )。any?
!empty?
any?
true
" "
当然,也可以查看上面的 1.9 评论。
评论
小贴士:!obj.blank? == obj.present?
在某些表情中可以方便/更容易对眼睛
评论
present?
是active_support的一部分,请在此处查看要包含的内容以获取它: stackoverflow.com/a/4648704/1569
!!false
一种特殊情况是尝试评估布尔值是否为 nil:
false.present? == false
false.blank? == true
false.nil? == false
在这种情况下,建议使用.nil?
我用所有的情况制作了这个有用的表格:
blank?
,由 Rails 提供。present?
评论
any?
blank?
并且不是“仅限 Rails”,它们会自动包含在 Rails 中,但可以通过使用 ActiveSupport 的核心扩展轻松包含在非 Rails 代码中。请参阅 stackoverflow.com/questions/4238867/...present?
只需扩展 Julian 的表:
评论
Enumerable#any?
是香草 Ruby,它不应该列在“仅限 rails”下
.zero?
.nonzero?
nil?
是一个标准的 Ruby 方法,可以在所有对象上调用,如果对象是:true
nil
b = nil
b.nil? # => true
empty?
是一个标准的 Ruby 方法,可以在一些对象(如 Strings、Arrays 和 Hashes)上调用,如果这些对象不包含任何元素,则返回:true
a = []
a.empty? # => true
b = ["2","4"]
b.empty? # => false
empty?
不能在对象上调用。nil
blank?
是一个 Rails 方法,可以在对象和空对象上调用。nil
其他人都很好地解释了有什么区别。
我想在Ruby On Rails中添加,最好使用or代替或。obj.blank?
obj.present?
obj.nil?
obj.empty?
obj.blank?
处理所有类型 、 、 、 ,如果值不可用,则返回,如果值在任何类型的对象上可用,则返回。nil
''
[]
{}
true
false
轨道 4
@corban-brook 的“数组 gotcha: blank?”的替代方案,用于检查数组是否只包含空值并且可以被视为空白?真:
[ nil, '' ].all? &:blank? == true
也可以这样做:
[nil, '', "", " ",' '].reject(&:blank?).blank? == true
nil?
可用于任何对象。它确定对象是否具有任何值,包括“空白”值。
例如:
example = nil
example.nil? # true
"".nil? # false
基本上,只有当对象实际上等于“nil”时,才会返回 true。nil?
empty?
仅在被视为集合的对象上调用。这包括字符串(字符的集合)、哈希(键/值对的集合)和数组(任意对象的集合)等内容。 如果集合中没有项,则返回 true。empty?
例如:
"".empty? # true
"hi".empty? # false
{}.empty? # true
{"" => ""}.empty? # false
[].empty? # true
[nil].empty? # false
nil.empty? # NoMethodError: undefined method `empty?' for nil:NilClass
请注意,不能对 nil 对象进行调用,因为 nil 对象不是集合,并且会引发异常。empty?
另请注意,即使集合中的项为空,也不意味着集合为空。
blank?
基本上是 和 的组合 它对于检查您认为是集合但也可能为 nil 的对象很有用。nil?
empty?
exists?
方法可用于检查数据库中是否存在数据。它返回布尔值 either 或 .true
false
评论
- 一切都是
nil?
blank?
- 一切都是
empty?
blank?
- 什么都不是
empty?
nil?
- 什么都不是
nil?
empty?
tl;dr -- 只使用 &,除非你想区分 和blank?
present?
""
" "
虽然这个问题有 n 个答案,但我喜欢这里解释它的方式,所以又发布了一个答案:-)
看看下面的数据指标 - 它不言自明,在可用方法中使用的各种数据类型。
#nil? | #empty? | #blank? | #present? | |
---|---|---|---|---|
5 | 假 | NoMethodError | 假 | 真 |
"" | 假 | 真 | 真 | 假 |
" " | 假 | 假 | 真 | 假 |
“\t\n” | 假 | 假 | 真 | 假 |
[] | 假 | 真 | 真 | 假 |
[“a”] | 假 | 假 | 假 | 真 |
{} | 假 | 真 | 真 | 假 |
{a: “b”} | 假 | 假 | 假 | 真 |
Set.new | 假 | 真 | 真 | 假 |
零 | 真 | NoMethodError | 真 | 假 |
真 | 假 | NoMethodError | 假 | 真 |
假 | 假 | NoMethodError | 真 | 假 |
参考: https://blog.appsignal.com/2018/09/11/differences-between-nil-empty-blank-and-present.html
评论
present?
blank?
:nil?
::Kernel
::NilClass
:empty?
::String
::Array
::Hash
::Set
::ActiveRecord::Relation
:nil?
::Object
::Kernel
:empty?
nil
[1] pry(main)> [].blank? => true