为什么Ruby在搜索多个东西时需要或运算符来查找find_all方法?

时间:2016-11-14 21:19:06

标签: ruby operators

给出以下代码:

为什么Ruby在使用find_all方法搜索多个内容时需要or运算符?即:

x = [1,2,3,4,5]

variable = x.find_all do |x|
  x.even?||x.odd?
end
puts variable

我正在尝试弄清楚数组中的每个数字是偶数还是奇数。最后,最终得到variable的结果,如果它是这两者中的任何一个。

如果您尝试按顺序编写要查找的条件,则不起作用:

variable = x.find_all do |x|
  x.even?
  x.odd?
end

我很想知道为什么第一个例子有效,第二个例子没有。第二个等式,在我的脑海中,我认为你只是按顺序列出它们,试图找出x是否是偶数,然后确定x是否为奇数。不确定为什么它不起作用。在尝试搜索多个条件时,有人可以解释为什么必须使用或运算符而不是按顺序列出方法吗?

2 个答案:

答案 0 :(得分:3)

Ruby有一个隐式返回,其中方法或块中最后执行的行将是返回的行。考虑到这一点

variable = a.find_all do |x|
  x.even?
  x.odd?
end

在保持这一点时,只会考虑行x.odd?。你可以在没有像这样的操作员的情况下做到这一点

variable = a.find_all do |x|
  if x.even?
    true
  else
    x.odd?
  end
end

如果x.even?为真,那么将返回true,因为这是在块内运行的最后一行代码。如果x.even?为false,则将返回x.odd?,因为这是在块内运行的最后一行代码。如果您尝试使用||检查多个条件是有效的,但您也可以这样做。

假设我有数组a = ['dog', 2, 3.4, 'PIZZA', false, nil]。假设我想要所有小写字符串,所有整数和所有nil值。我可以这样做

a.find_all do |i|
  if i.is_a? String
    i == i.downcase
  elsif i.is_a? Numeric
    i == i.to_i
  else
    i.nil?
  end
end

这将返回['dog', 2, nil]

答案 1 :(得分:1)

find_all方法使用传递给它的块的返回值来迭代集合的每个元素,以测试元素是否匹配。然后返回一个包含匹配元素的新数组。

如果您使用此代码:

variable = x.find_all do |x|
  x.even?
  x.odd?
end

块的返回值为x.odd?,如同在ruby中,除非您明确使用return运算符,否则返回块或方法的最后一个表达式。 如果您想要将集合的元素分组是否奇怪,甚至您应该使用其他方法。例如,您可以使用group_by

[1,2,3].group_by { |x| x.even? }
=> {false=>[1, 3], true=>[2]}
[1,2,3].group_by { |x| x.even? ? :even : :odd }
=> {:odd=>[1, 3], :even=>[2]}