【问题标题】:Why does 6.times.map work in ruby 1.8.7 but not 1.8.6为什么 6.times.map 在 ruby​​ 1.8.7 中有效,但在 1.8.6 中无效
【发布时间】:2011-02-14 20:24:51
【问题描述】:

以下代码 sn-p 在 Mac OS X 上的 1.8.7 中可以正常工作,但在 Ubuntu 上的 1.8.6 中不能正常工作。为什么?有解决办法吗?

适用于 1.8.7:

$ ruby --version
ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0]
ltredgate15:eegl leem$ irb
>> 6.times.map {'foo'}
=> ["foo", "foo", "foo", "foo", "foo", "foo"]
>>

但不是在 1.8.6 中:

# ruby --version
ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux]
Ruby Enterprise Edition 20090610
# irb
irb(main):001:0> 6.times.map {'foo'}
LocalJumpError: no block given
        from (irb):1:in `times'
        from (irb):1
irb(main):002:0> 

为什么会有差异? 1.8.6 的解决方法是什么?

【问题讨论】:

    标签: ruby ruby-enterprise-edition


    【解决方案1】:

    在 1.8.7+ 的迭代器方法(如 times)中,如果在没有块的情况下调用它们,则返回一个枚举器。在 1.8.6 中你必须这样做

    require 'enumerator'
    6.enum_for(:times).map {...}
    

    或者对于这个特定的用例,你可以简单地做(0...6).map {...}

    【讨论】:

    • 您现在可以只需要您需要的反向端口。在这种情况下...require 'backports/1.8.7/integer/times'
    【解决方案2】:

    因为 1.8.6 #times 在给定块上产生,而 1.8.7 返回一个 Enumerator 对象,您可以保留并实现 Enumerable。

    【讨论】:

      【解决方案3】:

      在 Ruby 1.9 中,该库已更改,因此如果在没有块的情况下调用它们,则执行迭代的函数将返回一个 Enumerator 对象。大量其他语言特性也发生了变化,众所周知,为了改进整个语言,Ruby 1.8.x 和 Ruby 1.9 之间的兼容性会被破坏。大多数人并不觉得这太令人痛苦。

      Ruby 开发团队决定 Ruby 1.8.7 应该是一个过渡版本,添加了 Ruby 1.9 引入的一些库功能。他们对这个决定提出了很多批评,许多企业 Ruby 用户仍然(并且仍然很多)在 Ruby 1.8.6 上运行 Rails,因为他们觉得 1.8.7 引入的变化太大,而且风险太大。但尽管如此,1.8.7 仍然存在,迭代函数返回 Enumerators 是合并的功能之一。

      您在 1.8.7 中看到的正是这种迁移功能,而 1.8.6 中没有。

      sepp2k 的回答提供了一个很好的解决方法。我没有太多要补充的。

      【讨论】:

      【解决方案4】:

      Ruby 1.8.7 引入了many changes。如果你想在 Ruby 1.8.6 中使用它们,只需

      require 'backports'
      

      就是这样。这为您提供了 1.9.1 和即将推出的 1.9.2 的许多方法,尽管可以 require 'backports/1.8.7' 仅针对 1.8.7 的更改,甚至只是您需要的反向移植,例如require 'backports/1.8.7/integer/times'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-12
        • 2015-09-12
        • 2011-07-19
        • 2014-11-13
        • 2018-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多