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

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false

还是用unless。empty更好??


当前回答

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

任何?是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。

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

任何?是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, 1].any?
=> true
>> [nil, nil].any?
=> false

从文档中可以看到:

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

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

例子:

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

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

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

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