为什么在select方法中使用OR运算符而不是AND运算符?

时间:2017-09-10 18:54:24

标签: ruby logical-operators

给定一个家庭成员的散列,使用键作为标题和一组名称作为值,使用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方法返回一个空数组。

3 个答案:

答案 0 :(得分:3)

想一想。您的k是一个符号,符号可以同时为:sisters:brothers,是吗?因此,对于&&,块永远不会成立。

但在另一种情况下&&完成了这项工作。我们假设你要过滤掉20岁以上且不到60岁的人。

people.select { |person| person.age > 20 && person.age < 60 }

答案 1 :(得分:1)

在大多数编程语言中,||&&运算符分别表示orand

表达式:

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中)表示除ab之外的所有内容。

如果nilfalseak == :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 && bfalse,则a || b将返回true或{ {1}}是k。这就是你想要的。