我正在使用Ruby 2.4。 假设我有一个MyData
实例数组。每个对象都有一个属性attr1
。 给定我的数组
array = [myobj1, myobj2, myobj3]
如何检查数组中的每个对象是否包含 attr1
的nil
值?
试试这样的事情
my_arr.all? { |my_obj| my_obj.attr1.nil? }
TL;DR
如何检查数组中的每个对象是否
nil
包含attr1
?
array
.map(&:attr1) # maps by attr1
.compact # removes nil values from collection
.empty? # checks, whether array is empty
请注意,以下内容不区分false
值和nil
值。
可枚举# none?
:
该方法返回
true
如果块从不返回true
for all 元素。如果未给出块,则只有在以下情况下none?
才会返回true
没有一个集合成员true
。
它可以缩短为仅
array.map(&:attr1).none?
甚至更短(我敢打赌这是最短的一种:D(没有疯狂的元编程))
array.none?(&:attr1)
这基本上检查,是否没有一个object.attr1
是真实的。
方法是在想知道是否所有值都nil
时使用none?
:
[nil, nil].none? # => true
[true, nil].none? # => false
或者您可以使用any?
并切换布尔结果:
![nil, nil].any? # => true
![true, nil].any? # => false
扩展它以适合您的对象:
class MyData
def initialize(b)
@attr1 = b
end
def attr1
@attr1
end
end
obj1 = MyData.new(nil)
obj2 = MyData.new(true)
[obj1, obj1].none?(&:attr1) # => true
[obj1, obj2].none?(&:attr1) # => false
如果您可以拥有false
值并希望将它们视为与nil
不同,因为这将分解,因为none?
认为nil
值和false
值相同:
[false].none? # => true
(any?
和all?
也会被价值的真实性所愚弄。
为了解决这个问题,我会向类添加一个方法来测试该属性是否实际nil
:
def nil?
@attr1.nil?
end
然后使用 all?
的东西起作用:
obj3 = MyData.new(false)
[obj1, obj1].all?(&:nil?) # => true
[obj1, obj2].all?(&:nil?) # => false
[obj1, obj2, obj3].all?(&:nil?) # => false