Ruby 为什么在select方法中使用OR运算符而不是AND运算符?
给定一个家族成员散列,以键作为标题,以名称数组作为值,使用Ruby内置的Ruby 为什么在select方法中使用OR运算符而不是AND运算符?,ruby,logical-operators,Ruby,Logical Operators,给定一个家族成员散列,以键作为标题,以名称数组作为值,使用Ruby内置的select方法将直系家族成员的姓名收集到一个新数组中 # Given family = { uncles: ["bob", "joe", "steve"], sisters: ["jane", "jill", "beth"], brothers: ["frank","rob","david"], aunts: ["mary","sally","su
select
方法将直系家族成员的姓名收集到一个新数组中
# Given
family = { uncles: ["bob", "joe", "steve"],
sisters: ["jane", "jill", "beth"],
brothers: ["frank","rob","david"],
aunts: ["mary","sally","susan"]
}
解决办法是:
immediate_family = family.select do |k, v|
k == :sisters || k == :brothers
end
arr = immediate_family.values.flatten
p arr
为什么在select方法中使用
|
运算符而不是&&
运算符?当我使用&&
运行它时,select方法返回一个空数组。仔细想想。你的k
是一个符号,符号不能同时是:姐妹
和:兄弟
,对吗?因此,使用&&
时,块将永远不会为真
但在另一种情况下,&&
起作用。比如说,你想过滤掉20岁以上60岁以下的人
people.select { |person| person.age > 20 && person.age < 60 }
people.select{| person | person.age>20&&person.age<60}
在大多数编程语言中,|
和&
运算符分别表示或和和
表达方式:
family.select do |k, v|
k == :sisters || k == :brothers
end
将转换为“选择family
散列的所有元素,其中键为:sisters
或:brothers
”。正如@Ursus所指出的,在这种情况下,k
同时等于:brother
和:sister
是没有意义的。&&
和|
是逻辑运算符:
a&b
是真实的,如果a
和b
都是真实的
- 如果
a
是真实的或b
是真实的(或两者都是),则a | | b
是真实的
truthy(在Ruby中)的意思是除了nil
或false
之外的一切
让我们看看发生了什么,如果a
是k==:姐妹
和b
是k==:兄弟
:
k a b a && b a || b
:uncles false false false false
:sisters true false false true
:brothers false true false true
:aunts false false false false
对于给定的值,a和&b
将始终返回false
,而a | b
将返回true
如果k
是:姐妹
或者k
是:兄弟
。这就是你想要的。什么东西可以同时是姐妹和兄弟?