给定一个家庭成员的散列,使用键作为标题和一组名称作为值,使用Ruby的内置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方法返回一个空数组。
答案 0 :(得分:3)
想一想。您的k
是一个符号,符号可以同时为:sisters
和:brothers
,是吗?因此,对于&&
,块永远不会成立。
但在另一种情况下&&
完成了这项工作。我们假设你要过滤掉20岁以上且不到60岁的人。
people.select { |person| person.age > 20 && person.age < 60 }
答案 1 :(得分:1)
在大多数编程语言中,||
和&&
运算符分别表示or
和and
。
表达式:
family.select do |k, v|
k == :sisters || k == :brothers
end
会转换为&#34;选择密钥为familiy
或:sisters
&#34;的:brothers
哈希的所有元素。正如@Ursus指出的那样,在这种情况下,k
同时等于:brother
和:sister
是没有意义的。
答案 2 :(得分:0)
Model.ExternalWebsite
和<a href="@Model.ExternalWebsite">…</a>
是逻辑运算符:
&&
和||
都是真实的,则a && b
是真实的a
如果b
真实或者a || b
是真实的(或两者兼有),则属于真实的 truthy (在Ruby中)表示除a
或b
之外的所有内容。
如果nil
为false
且a
为k == :sisters
,请查看会发生什么:
b
对于给定的值,k == :brothers
将始终返回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
或{ {1}}是k
。这就是你想要的。