【发布时间】:2010-11-26 14:37:13
【问题描述】:
我知道 Python 的 list 方法可以使用生成器中的所有元素。 Ruby 中有类似的东西吗?
我知道:
elements = []
enumerable.each {|i| elements << i}
我也知道inject 替代方案。有现成可用的方法吗?
【问题讨论】:
标签: ruby list iterator enumerable
我知道 Python 的 list 方法可以使用生成器中的所有元素。 Ruby 中有类似的东西吗?
我知道:
elements = []
enumerable.each {|i| elements << i}
我也知道inject 替代方案。有现成可用的方法吗?
【问题讨论】:
标签: ruby list iterator enumerable
如果您想对枚举中的所有元素进行一些转换,#collect(又名#map)方法会很有帮助:
elements = enumerable.collect { |item| item.to_s }
在此示例中,elements 将包含 enumerable 中的所有元素,但每个元素都转换为字符串。例如
enumerable = [1, 2, 3]
elements = enumerable.collect { |number| number.to_s }
在这种情况下,elements 将是 ['1', '2', '3']。
这是 irb 的一些输出,说明了 each 和 collect 之间的区别:
irb(main):001:0> enumerable = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> elements = enumerable.each { |number| number.to_s }
=> [1, 2, 3]
irb(main):003:0> elements
=> [1, 2, 3]
irb(main):004:0> elements = enumerable.collect { |number| number.to_s }
=> ["1", "2", "3"]
irb(main):005:0> elements
=> ["1", "2", "3"]
【讨论】:
each 中这样做。
each 和 collect 之间的区别在于 each 不返回数组,而 collect 可以。因此,如果您在我的上一个示例中将each 替换为collect,elements 将是原始数字数组(即与enumerable 相同),不是 数字字符串数组(即使用collect 会得到什么。
elements.each {|e| list << e.to_s } 做同样的事情。我发现您使用哪种方法只是个人喜好问题。
collect,您可以一步初始化和填充数组,而使用each,您必须初始化数组事先。
a=[];b=1.upto(5).collect{|i|a<<i}。然后尝试1.upto(5).collect { |i| i }。 a (最终)是正确的,但只有在它被评估 5 次之后。后者如您所愿返回一个数组。
Enumerable#to_a
【讨论】:
#to_a 和#force 的Enumerator::Lazy(出于相同目的)。你可以在这里阅读更多内容Ruby 2.0 Enumerable::Lazy