检查数组不是空的:任何?
用数组来检查一个数组是否为空是不是很糟糕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议使用unless
和blank
检查是否为空。
例如:
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立。
一些额外的想法:
- 这跟
present?
不一样了present?
来自ActiveSupport。 - 你可能想要一个
String
的自定义版本,忽略空白(像present?
这样做)。 - 你可能想要名字的
length?
对于String
或其他可能更具描述性的types。 - 您可能需要定制
Integer
和其他Numeric
types,以便逻辑0返回false
。