使用any检查数组是否不为空是不好的吗?方法?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
还是用unless。empty更好??
使用any检查数组是否不为空是不好的吗?方法?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
还是用unless。empty更好??
任何?不就等于不空吗?在某些情况下。
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
从文档中可以看到:
如果没有给出块,Ruby会补充 {|obj| obj}的隐式块 是吗?将返回true如果至少 集合成员中有一个不是 False或nil)。
一个数组将其值赋值为true或赋值为空之间的区别。
方法为空?来自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
有什么方法吗?来自Enumerable模块。 http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
它用于计算数组中的“any”值是否为true。 类似的方法是没有?,所有?和一个吗?,它们都只是检查true可以被求值的次数。它与数组中找到的值的计数无关。
案例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
我建议使用unless和blank来检查是否为空。
例子:
unless a.blank?
a = "Is not empty"
end
这将知道'a'是否为空。 如果'a'为空,则下面的代码将无法运行。
避免任何?用于大型数组。
任何?是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。