我正在使用Ruby 2.4。假设我有一组MyData
个实例。每个对象都有一个属性attr1
。鉴于我的阵列
array = [myobj1, myobj2, myobj3]
如何检查数组中的每个对象是否包含nil
的{{1}}值?
答案 0 :(得分:6)
尝试这样的事情
my_arr.all? { |my_obj| my_obj.attr1.nil? }
答案 1 :(得分:1)
如何检查数组中的每个对象是否包含
Organization
值nil
?
attr1
array
.map(&:attr1) # maps by attr1
.compact # removes nil values from collection
.empty? # checks, whether array is empty
和false
值。如果块永远不会返回
nil
,则该方法返回true
元素。如果未给出阻止,则true
仅在返回none?
时才会返回 收集成员都不是true
。
可以简化为
true
甚至更短(我打赌这是最短的可能:D(没有疯狂的元编程))
array.map(&:attr1).none?
基本上检查array.none?(&:attr1)
是否真的是真的。
答案 2 :(得分:-1)
最简单的方法是,当您想知道所有值是否为none?
时,使用nil
:
[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