【问题标题】:How can I get a list from a Ruby enumerable?如何从 Ruby 可枚举中获取列表?
【发布时间】:2010-11-26 14:37:13
【问题描述】:

我知道 Python 的 list 方法可以使用生成器中的所有元素。 Ruby 中有类似的东西吗?

我知道:

elements = []
enumerable.each {|i| elements << i}

我也知道inject 替代方案。有现成可用的方法吗?

【问题讨论】:

    标签: ruby list iterator enumerable


    【解决方案1】:

    如果您想对枚举中的所有元素进行一些转换,#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 的一些输出,说明了 eachcollect 之间的区别:

    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 中这样做。
    • Geo:eachcollect 之间的区别在于 each 不返回数组,而 collect 可以。因此,如果您在我的上一个示例中将each 替换为collectelements 将是原始数字数组(即与enumerable 相同),不是 数字字符串数组(即使用collect 会得到什么。
    • 我指的不是你提到的那个案例。 elements.each {|e| list &lt;&lt; e.to_s } 做同样的事情。我发现您使用哪种方法只是个人喜好问题。
    • Geo:这对个人品味来说是正确的,但可以说,使用collect,您可以一步初始化和填充数组,而使用each,您必须初始化数组事先。
    • @Tempus 有时会有所不同。试试a=[];b=1.upto(5).collect{|i|a&lt;&lt;i}。然后尝试1.upto(5).collect { |i| i }a (最终)是正确的,但只有在它被评估 5 次之后。后者如您所愿返回一个数组。
    【解决方案2】:

    Enumerable#to_a

    【讨论】:

    • Ruby 2.0 引入了具有#to_a#forceEnumerator::Lazy(出于相同目的)。你可以在这里阅读更多内容Ruby 2.0 Enumerable::Lazy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多