给出以下代码:
为什么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是否为奇数。不确定为什么它不起作用。在尝试搜索多个条件时,有人可以解释为什么必须使用或运算符而不是按顺序列出方法吗?
答案 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]}