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



我正在使用Ruby 2.4。 假设我有一个MyData实例数组。每个对象都有一个属性attr1 。 给定我的数组

array = [myobj1, myobj2, myobj3]

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

试试这样的事情

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

相关内容

  • 没有找到相关文章

最新更新