当`@ filters.values'时,@filters.values.all? == false
怎样才能返回true
清楚地显示了三个真正的价值观?
编辑: 如何检查每个值是否为假?
EDIT2:因为人们想要复制并粘贴任意代码段:
f = {
self: true,
clear: true,
something1: false,
something2: true
}
f.all? == false
==> false
f.values.all? == false
==> true
f.values
==> [true, true, false, true]
答案 0 :(得分:4)
Enumerable#all?
,来自文档:
将集合的每个元素传递给给定的块。方法 如果块永远不返回false或nil,则返回true。如果块是 没有给出,Ruby添加了一个隐含的{| obj |块obj}哪个会 全因?当没有集合成员时返回true 假或没有。
这意味着@filters.values.all?
将返回false,除非每个属性都设置为true(或者更真实),所以,如果你想知道每个项目的时间是false
,那么你将会必须将一个块传递给all?
并检查每个值,如下所示:
@filters.values.all? { |value| value == false } #=> true
<强>更新强>
之前的回答指出,当!@filters.values.all?
为true
时,values
也会返回truthy
,而且这是真的,但它也会返回{{1}如果只有一个设置为true
;实际上,除非所有false
都设置为true
,否则它始终会返回values
。
答案 1 :(得分:1)
我想all?
方法会调用每个块
对于eaxmple enumerable.all?
将执行如下:
enumerable.each {|x| x }
hash_enumerable.each {|k, _v| k }
因此,当可枚举是一个哈希时,块firt params将成为关键......
答案 2 :(得分:1)
要检查哈希值中的所有值是否为false
,请尝试以下操作:
temp = {self: false, clear: false, lorem: false, ipsum: false}
temp.values.uniq == [false]
#=> true
temp2 = {self: true, clear: true, lorem: false, ipsum: true}
temp2.values.uniq == [false]
#=> false
答案 3 :(得分:1)
确定所有值是否为假的更短但更不清楚的方法是简单地询问它们中是否有任何一个是否为真,并否定响应:
@filters = {foo: false, bar: true, baz: false}
!@filters.values.any? #=> false
@filters = {foo: false, bar: false, baz: false}
!@filters.values.any? #=> true