如何检查Ruby数组中的每个对象是否都具有nil属性?

时间:2017-01-17 16:01:22

标签: arrays ruby null attributes

我正在使用Ruby 2.4。假设我有一组MyData个实例。每个对象都有一个属性attr1。鉴于我的阵列

array = [myobj1, myobj2, myobj3]

如何检查数组中的每个对象是否包含nil的{​​{1}}值?

3 个答案:

答案 0 :(得分:6)

尝试这样的事情

my_arr.all? { |my_obj| my_obj.attr1.nil? }

答案 1 :(得分:1)

TL; DR

  

如何检查数组中的每个对象是否包含Organization值   nil

attr1

请注意,以下内容未区分array .map(&:attr1) # maps by attr1 .compact # removes nil values from collection .empty? # checks, whether array is empty false值。

Enumerable#none?

  

如果块永远不会返回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?认为nilfalse的值相同:

[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