检查数组是否为空:是吗?

siv*_*udh 172 ruby arrays

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

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false
Run Code Online (Sandbox Code Playgroud)

或者它更好用unless a.empty?吗?

Mar*_*rth 228

any?not empty?某些情况不同.

>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
Run Code Online (Sandbox Code Playgroud)

从文档:

如果没有给出块,Ruby会添加一个{| obj |的隐式块 obj}(即如果至少有一个集合成员不是false或nil,那么将返回true).

  • @dantastic`#present?`仅限Rails.在纯Ruby中,你会得到"NoMethodError:undefined method"吗?对于Array`. (13认同)
  • @RocketR你可能想要签出`present?`方法. (10认同)
  • 有没有与`empty?'相反的函数? (7认同)
  • 不完全是Rails,[Active Support](https://rubygems.org/gems/activesupport)可以在没有rails的情况下使用,只需要`require'activesupport'`. (5认同)

Pol*_*her 75

将数值计算为true或者为空的数组之间的差异.

该方法empty?来自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
Run Code Online (Sandbox Code Playgroud)

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

它用于评估数组中的"any"值是否为true.类似的方法是没有?所有?还有一个?在那里他们都只是检查以确定可以评估多少次真实.这与数组中找到的值的数量无关.

情况1

>> a = []
=> []
>> a.any?
=> false
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> true
Run Code Online (Sandbox Code Playgroud)

案例2

>> a = [nil, true]
=> [nil, true]
>> a.any?
=> true
>> a.one?
=> true
>> a.all?
=> false
>> a.none?
=> false
Run Code Online (Sandbox Code Playgroud)

案例3

>> a = [true, true]
=> [true, true]
>> a.any?
=> true
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> false
Run Code Online (Sandbox Code Playgroud)


Den*_*yan 30

使用感叹号对语句进行前缀可以让您知道数组是否为空.所以在你的情况下 -

a = [1,2,3]
!a.empty?
=> true
Run Code Online (Sandbox Code Playgroud)

  • 双重否定?你是认真的吗? (26认同)
  • 他是如此不严肃! (24认同)
  • 双重否定是原始问题"检查数组不空"的一部分.这回答了这个问题. (9认同)
  • 呵呵.双重否定并不理想,在这种特定情况下似乎更具可读性. (5认同)

aku*_*uhn 23

避免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;
}
Run Code Online (Sandbox Code Playgroud)

empty? 另一方面,仅检查阵列的长度.

static VALUE
rb_ary_empty_p(VALUE ary)
{
  if (RARRAY_LEN(ary) == 0)
    return Qtrue;
  return Qfalse;
}
Run Code Online (Sandbox Code Playgroud)

如果您的"稀疏"数组以许多nil值开头,例如刚刚创建的数组,则差异是相关的.


小智 6

我会建议使用unlessblank检查是否为空。

例子 :

unless a.blank?
  a = "Is not empty"
end
Run Code Online (Sandbox Code Playgroud)

这将知道“a”是否为空。如果“a”为空,则以下代码将不会运行。

  • `#blank?` 是 Rails 的一部分。如果他们已经在使用 Rails,那么 `#present?` 是对 `#blank?` 的否定。 (5认同)