我发现自己不断地在寻找一个清晰的定义,即nil?、blank?和empty?在ruby on rails中的区别。这是我最近的一次:
是否有什么遗漏,或者可以进行更严格的比较?
- 一个gotcha是一个空数组,它为present?返回false。这是因为对于空数组,blank?返回true。
- 一个好处是,:nil?在::Kernel上定义,在::NilClass上重写,而:empty?在许多类(本机在::String上、::Array上、::Hash上分别实现,而非本机在stdlib上的::Set和rails上的::ActiveRecord::Relation等其他类上实现。因此,:nil?可用于::Object的所有子类,也可用于包括::Kernel的每个类,其中:empty?必须在您的类中具体实施或包括。
- 如果你试图理解整个nil概念,从这里开始。
- [1] pry(main)> [].blank? => true
.nil?可用于任何对象,如果对象为零,则为真。
.empty?可用于字符串、数组和哈希,并在以下情况下返回true:
在零的东西上运行.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 |
- 如问题中所述,一些非空字符串计为空。
- 为什么他们不把零的重写。空的?如果可以的话。空白?
- 你能用"现在"来更新你的答案吗?方法?
- 怎么样?有吗?
- 另外:false.blank? == true。
- nil.blank?是不是由rails添加的?在1.9.3p194中,我在irb中得到NoMethodError: undefined method 'blank?' for nil:NilClass。E:是的,这里是:api.rubyonrails.org/classes/object.html method-i-blank-3f
- 我会提到presence!
- 我以前见过blank?在非Rails环境中错误地使用。如果你真的需要它,你可以包括:require 'active_support/core_ext/object/blank'。
- 在谈到present?时,不要忘记提到presence。blog.bmonkeys.net/2014/…
- 除了Tom在回答中提到的所有空白数组gotcha之外,请注意,这可能会导致安全问题,攻击者可以使用未准备好的代码来简单地检查,除非参数为.nil?或者除非params.blank?是目前在Rails中进行大量讨论和工作的原因。有关详细信息,请参阅此处:github.com/rails/rails/issues/13420
- 我正在使用类似的东西来避免在零对象上崩溃,如果(mystring.to-u.strip.length!)=0)做某事结束
- 我曾多次使用x.to_s.empty?,在这些场合中,无论变量是零还是空的字符串/数组,我都想做同样的事情。nil.to_s ==""
我用所有的箱子做了这个有用的桌子:
blank?和present?由轨道提供。
- 应该注意的是,空白?现在呢?只是铁轨。它们返回异常:Ruby2.0.0中的NoMethodError。
- 如果更新了表,可以考虑添加any?。
- 考虑在这张精彩的图表中添加新行
扩展朱利安的桌子:
裁判:空的?空白?零?傻傻分不清楚
- @王思文,我已经下载了这张表,并用它在我的一些答案中添加了学分。希望你不要介意:)为这一伟大的努力而感到光荣!
- Enumerable#any?是香草红宝石,不应列在"rails only"下。
- @丹尼尔,谢谢你的提醒,桌子已经更新了。
- 数字类型也有.zero?和.nonzero?。
- 它不必用轨道捆绑,例如github.com/samsaffron/fast_blank(require 'fast_blank';"".blank?)
- 仅供参考:rails还提供Object#presence,如果对象是present?,则返回该对象;如果对象不是nil,则返回该对象。这对于简洁的代码很方便:if (name = params[:name].presence) ... 。这种快捷方式避免了像params[:name] = ' '这样的情况。
快速提示:!obj.blank? == obj.present?。
在某些表达方式中,对眼睛来说很方便
- 有什么等价物吗?反对吗?
- present?是主动支持的一部分,请查看下面要包含哪些内容:stackoverflow.com/a/4648704/1569
- @ Kirk:!!obj等于!反对吗?
- @不,不是。!!false
- 啊,@ajedi32接球好!相当于那个例外。
- 基于这个答案…推论:if obj.present?和unless obj.blank?是相同的。提示:一个很好的保护条款是return unless obj.present?。
一个区别是.nil?和.empty?是由编程语言ruby提供的方法,而.blank?是由web开发框架rails添加的。
- 以东的一切都是以东的。
- 所有的东西都是
- 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注释。
- 在Rails中,任何只包含空白字符的字符串都是"blank":"
".blank?α=>真
别忘了any?,一般是!empty?。在Rails中,我通常在与if something或unless something的语句末尾检查是否存在某些内容,然后根据需要使用blank?,因为它似乎在任何地方都可以工作。
- 有吗?Ruby1.9中的字符串不可用,有吗?要求可枚举,而字符串本身在Ruby1.9中不起作用。
- 注意any?检查非空性。如果您有一个错误值数组,它将返回false。解决这个问题的一个方法是通过一个始终真实的模块:[nil, false].any?{ true },但!empty?较短,而且你不记得奇怪的行为。
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?方法检查数据库中是否存在数据。它返回布尔值true或false。
钢轨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?的组合,它对检查假定为集合的对象很有用,但也可以为零。