检查数组不是空的:任何?

用数组来检查一个数组是否为空是不是很糟糕any? 方法?

 a = [1,2,3] a.any? => true a.clear a.any? => false 

或者是否更好使用, unless a.empty?

any? 是不是一样not empty? 在某些情况下。

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

从文档:

如果没有给出块,Ruby会添加{| obj |的隐式块 obj}(这是任何?将返回true,如果至less有一个集合成员不是false或零)。

数组之间的区别,评估它的值为真或空。

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

它用来检查数组是否包含某些东西。 这包括评估为虚假的事物,例如无和假。

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

它用于评估数组中的“任何”值是否为真。 类似的方法是没有? 所有? 和一个? 在那里他们都只是检查看看有多less次真实的评估。 这与在数组中find的值的数量无关。

情况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 

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

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

避免any? 对于大型arrays。

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

any? 不检查长度,但实际上扫描整个arrays的真实元素。

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

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

例如:

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

这将知道'一'空或不。 如果“a”是空的,则下面的代码将不会运行。

我不认为这是不好的使用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。 这很容易build立。

一些额外的想法:

  1. 这跟present?不一样了present? 来自ActiveSupport。
  2. 你可能想要一个String的自定义版本,忽略空白(像present?这样做)。
  3. 你可能想要名字的length? 对于String或其他可能更具描述性的types。
  4. 您可能需要定制Integer和其他Numerictypes,以便逻辑0返回false