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

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false

还是用unless。empty更好??


任何?不就等于不空吗?在某些情况下。

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

从文档中可以看到:

如果没有给出块,Ruby会补充 {|obj| obj}的隐式块 是吗?将返回true如果至少 集合成员中有一个不是 False或nil)。


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

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

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

方法为空?来自Array类 http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F

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

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

有什么方法吗?来自Enumerable模块。 http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F

它用于计算数组中的“any”值是否为true。 类似的方法是没有?,所有?和一个吗?,它们都只是检查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

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

例子:

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

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


避免任何?用于大型数组。

任何?是O (n) 空的吗?是O (1)

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

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;
}

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

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

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


我不认为用它有什么不好?在所有。我经常用它。它清晰而简洁。

然而,如果你关心的是所有的nil值抛出它,那么你实际上是在问数组的大小是否为> 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。而且很容易建立在它的基础上。

一些额外的考虑:

这和现在不一样吗?从ActiveSupport这样。 你可能想要一个String的自定义版本,忽略空白(比如present?做)。 您可能需要名称长度?String或其他可能更具描述性的类型。 您可能希望它为Integer和其他Numeric类型自定义,以便逻辑0返回false。