在ruby中模拟每个没有块的每个片段< 1.8.7

时间:2009-09-22 13:05:16

标签: ruby-on-rails emulation

我试图使用jruby 1.3.1,快速和culerity来测试我的rails应用程序javascript。 应用程序本身在ruby 1.8.7 + phusion乘客下运行(运行正常,无测试:))

一切安装工作正常但我的应用程序使用some_enumerable.each_slice(10)将较大的数组拆分为较小的子数组,每个数组包含10个元素。

Celerity需要jruby和jruby只有ruby 1.8.6兼容,因此不支持无块each_slice。

所以我正在考虑定义一个initalizer,如果RUBY_PLATFORM ==“java”(或RUBY_VERSION < 1.8.7

,则添加此功能

到目前为止,我得到了(原因不复存在的代码):

if true #ruby 1.8.6
module Enumerable
  alias_method :original_each_slice, :each_slice
  def each_slice(count, &block)
    # call original method in 1.8.6
    if block_given?
      original_each_slice(count, block)
    else
      self.enum_for(:original_each_slice, count).to_a
    end
  end
end
end

这段代码显然不起作用,我真的很感谢有人指点我的解决方案。

谢谢!

更新: 解决方案感谢sepp2k指出我的错误:

if RUBY_VERSION < "1.8.7"
  require 'enumerator'
  module Enumerable
    alias_method :original_each_slice, :each_slice
    def each_slice(count, &block)
      if block_given?
        # call original method when used with block
        original_each_slice(count, &block)
      else
        # no block -> emulate
        self.enum_for(:original_each_slice, count)
      end
    end
  end
end

2 个答案:

答案 0 :(得分:2)

original_each_slice(count, block)应为original_each_slice(count, &block)

另外,如果你省略to_a,你将更接近1.8.7+的行为,它返回一个枚举器,而不是一个数组。

(别忘了require 'enumerator' btw)

答案 1 :(得分:1)

结帐'backports'宝石:)