用any可以吗?'来检查数组是否为空?

使用any?方法检查数组是否为空是否不好?

a = [1,2,3]


a.any?
=> true


a.clear


a.any?
=> false

还是使用unless a.empty?更好?

284035 次浏览

在某些情况下,any?not empty?不相同。

>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false

从文档中可以看到:

如果没有给出block, Ruby会添加 {|obj| obj}的隐式块 是吗?将返回true如果至少 集合成员中有一个不是

在语句前面加上感叹号可以让您知道数组是否为空。所以在你的情况下

a = [1,2,3]
!a.empty?
=> true

数组将其值赋值为true或赋值为空之间的区别。

empty?方法来自数组类
http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F < / p >

它用于检查数组是否包含某些内容。这包括求值为false的东西,比如nilfalse

>> a = []
=> []
>> a.empty?
=> true
>> a = [nil, false]
=> [nil, false]
>> a.empty?
=> false
>> a = [nil]
=> [nil]
>> a.empty?
=> false

any?方法来自Enumerable模块。
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F < / p >

它用于评估是否“;any"数组中的value计算结果为true。 与此类似的方法有none?all?one?,它们都只是检查可以计算多少次true。与数组中找到的值的计数无关。

案例1

>> a = []
=> []
>> a.any?
=> false
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> true

案例2

>> a = [nil, true]
=> [nil, true]
>> a.any?
=> true
>> a.one?
=> true
>> a.all?
=> false
>> a.none?
=> false

案例3

>> a = [true, true]
=> [true, true]
>> a.any?
=> true
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> false

我建议使用__abc0和blank来检查是否为空。

例子:

unless a.blank?
a = "Is not empty"
end

这将知道'a'是否为空。 如果'a'为空,则下面的代码将不会运行

对于大型数组,避免使用any?

  • any?O(n)
  • empty?O(1)

any?不检查长度,而是扫描整个数组以寻找真值元素。

static VALUE
rb_ary_any_p(VALUE ary)
{
long i, len = RARRAY_LEN(ary);
const VALUE *ptr = RARRAY_CONST_PTR(ary);


if (!len) return Qfalse;
if (!rb_block_given_p()) {
for (i = 0; i < len; ++i) if (RTEST(ptr[i])) return Qtrue;
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qtrue;
}
}
return Qfalse;
}

另一方面,empty?只检查数组的长度。

static VALUE
rb_ary_empty_p(VALUE ary)
{
if (RARRAY_LEN(ary) == 0)
return Qtrue;
return Qfalse;
}

如果你有一个以大量nil值开头的“稀疏”数组,比如一个刚创建的数组,这种差异是相关的。

我认为使用any?一点都不坏。我经常用它。它清晰而简洁。

然而,如果你关心的是所有nil值抛出它,那么你实际上是在问数组是否有size > 0。在这种情况下,这个非常简单的扩展(没有优化,猴子风格)会让你接近。

Object.class_eval do


def size?
respond_to?(:size) && size > 0
end


end


> "foo".size?
=> true
> "".size?
=> false
> " ".size?
=> true
> [].size?
=> false
> [11,22].size?
=> true
> [nil].size?
=> true

这是相当描述性的,逻辑上问“这个对象有大小吗?”它很简洁,不需要ActiveSupport。而且很容易建立在它的基础上。

一些额外的考虑:

  1. 这与ActiveSupport中的present?不同。
  2. 你可能想要String的自定义版本,它忽略空白(就像present?一样)。
  3. 你可能想要将length?命名为String或其他更有描述性的类型。
  4. 你可能希望它为Integer和其他Numeric类型自定义,以便逻辑0返回false