问答中心分类: RUBY可以使用“any”吗?`检查数组是否为空?
0
匿名用户 提问 15小时 前

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

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false

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

5 Answers
0
Polygon Pusher 回答 15小时 前

数组计算其值与true或者如果它是空的。
方法empty?来自Array类
http://ruby-doc.org/core-2.0.0/Array.html#method-i-空-3F
它用于检查数组是否包含某些内容。这包括评估为false例如nilfalse.

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

方法any?来自可枚举模块。
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
它用于计算数组中的“any”值是否计算为true.none?,all?one?,他们都只是检查可以评估多少次真值。这与数组中找到的值的计数无关。
案例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
0
akuhn 回答 15小时 前

避免any?对于大型阵列。

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

any?不检查长度,但实际扫描整个数组中的truthy元素。

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值,例如刚创建的数组。

David Costa 回复 15小时 前

在这个用例中,只有当您有以大量nil值,使用“普通”数组any?如果在第一个元素处没有块返回,那么复杂性仍然是O(1),就像empty?方法

0
Denny Abraham Cheriyan 回答 15小时 前

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

a = [1,2,3]
!a.empty?
=> true
3lvis 回复 15小时 前

双重否定?你是认真的吗?

Alexander Bird 回复 15小时 前

他不是认真的!

Denny Abraham Cheriyan 回复 15小时 前

呵呵。双重否定并不理想,只是在这种情况下看起来更具可读性。

mattfitzgerald 回复 15小时 前

双重否定是原始问题“检查数组是否为空”的一部分。这回答了问题。

0
Dennis 回答 15小时 前

我建议使用unlessblank检查是否为空。
例子:

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

这将知道“a”是否为空。

Eva 回复 15小时 前

#blank?是导轨的一部分。如果他们已经在使用Rails,#present?是对#blank?无论如何

Chiara Ani 回复 15小时 前

这是关于数组而不是字符串的问题。

0
lilole 回答 15小时 前

我不认为使用它不坏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. 这与present?来自ActiveSupport。
  2. 您可能需要的自定义版本String,忽略空白(如present?是的)。
  3. 你可能想要这个名字length?对于String或其他更具描述性的类型。
  4. 您可能需要对其进行自定义Integer和其他Numeric类型,以便逻辑零返回false.