【问题标题】:Refer to anonymous array within each/block在每个/块中引用匿名数组
【发布时间】:2014-04-19 04:51:50
【问题描述】:

我在 Ruby 中有以下内容:

arr = [1, 2]
arr.each{|n| arr << n unless n > 2_000}

如果我匿名定义它,有什么方法可以从块中引用我的数组?

[1,2].each{|n| self << n unless n > 2_000}

还是什么?我猜不是因为我想不出可以引用它的方法。

【问题讨论】:

  • 1) 不,你不能。 2) 请勿修改您正在迭代的集合。
  • @Sergio Tulentsev,1) 你总是可以编写自己的迭代器,将self 作为参数传递给给定的块 2) 添加 map 是 Matz 错误!,展平!等红宝石?附言。无意冒犯,只是讨论:)
  • @Sergio Tulentsev,哈哈,你是对的 :)

标签: ruby arrays block each enumerable


【解决方案1】:

这里有类似(尽管已经过时)的问题:

Call to iterating object from iterator

How to get a reference to a 'dynamic' object call?

你也可以这样创建一个单行:

(arr = [1, 2]).each{|n| arr << n unless n > 2_000}

【讨论】:

    【解决方案2】:

    在迭代时更改数组可能会导致无限循环。

    你可以这样做:

    arr = [1, 2]
    arr += arr.select { |n| n <= 2000 }
    

    【讨论】:

    • 太糟糕了,这破坏了我的 Project Euler fibonnaci 解决方案:arr.each{|x| arr &lt;&lt; arr[-1] + fib[-2] unless x &gt; 4_000_000 }.select{|n| n % 2 == 0}.reduce(:+)
    【解决方案3】:
    [].tap { |e| e.concat([1,2,20000].select { |n| n <= 2000 })
    

    【讨论】:

      猜你喜欢
      • 2016-04-27
      • 2012-05-10
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      相关资源
      最近更新 更多