如果您尝试来包装你的代码的方法,那么它不会给你一个错误:
def some_method
odds_n_ends = [:weezard, 42, "Trady Blix", 3, true, 19, 12.345]
ints = odds_n_ends.select { |x| if x.is_a?(Integer) then return true end }
puts ints
end
puts some_method
这段代码的输出是真实的。但是,请等待,在哪里放入? Ruby没有达到。当你把回报放在一个Proc中时,你将返回整个方法的范围。在你的例子中,你没有任何方法来放置你的代码,所以在它遇到'return'之后,它不知道'跳转到'哪里,继续。
Array#select基本上以这种方式工作:对于数组中的每个元素(用代码中的| x |表示),它会评估刚刚放入的块,如果块的计算结果为true,那么该元素将被包含在新阵列中。尝试删除从第二行“回归”,你的代码将工作:
ints = odds_n_ends.select { |x| if x.is_a?(Integer) then true end }
然而,这还不是最红宝石十岁上下的方式,你不必告诉红宝石明确地返回true。块({}之间的代码)就像方法一样,最后一个表达式是方法的返回值。因此,这将很好的工作:
ints = odds_n_ends.select { |x| if x.is_a?(Integer) } # imagine the code between {} is
#a method, just without name like 'def is_a_integer?' with the value of the last expression
#being returned.
顺便说一句,有解决你的问题更优雅的方式:
odds_n_ends = [:weezard, 42, "Trady Blix", 3, true, 19, 12.345]
ints = odds_n_ends.grep(Integer)
puts ints
见this link。它主要规定:
Returns an array of every element in enum for which Pattern === element.
要理解模式===元素,只需想象模式是一组(比方说,一个整数集)。元素可能是也可能不是该集合的一个元素(一个整数)。如何找出答案?使用===。如果您输入红宝石:
puts Integer === 34
它会评估为真。如果你把:
puts Integer === 'hey'
它会评价为false。
希望这有助于!
该块是一个列表理解。你可以简单地写成:ints = odds_n_ends.select {| x | x.is_a? Integer} – 2014-09-20 21:41:31
@DiegoBasch - 从未听说过这个列表理解。感谢您的建议。你能告诉我为什么我的逻辑错误吗? Ruby语言如何处理我的逻辑并抛出错误?如果我明白了,那对我来说会很容易。 – 2014-09-20 21:47:11
你不在方法中,所以没有什么可以返回。参见:http://stackoverflow.com/questions/2325471/using-return-in-a-ruby-block – 2014-09-20 21:49:35