Эмуляция each_slice без блока в ruby ​​<1.8.7 - PullRequest
1 голос
/ 22 сентября 2009

Я пытаюсь протестировать мой javascript для rails-приложений, используя jruby 1.3.1, быстроту и ловкость. Само приложение работает под ruby ​​1.8.7 + phusion passenger (и работает нормально, без теста :))

Все, что касается установки, работает нормально, но мое приложение использует some_enumerable.each_slice(10), чтобы разбить большой массив на меньший подмассив с 10 элементами каждый.

Для скорости требуется jruby, а jruby совместим только с ruby ​​1.8.6 и, следовательно, не поддерживает каждый безлимитный фрагмент.

Так что я думаю об определении инициализатора, который добавляет эту функцию, если 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 ]

2 голосов
/ 22 сентября 2009

original_each_slice(count, block) должно быть original_each_slice(count, &block).

Также, если вы пропустите to_a, вы будете ближе к поведению 1.8.7+, которое возвращает перечислитель, а не массив.

(не забудьте require 'enumerator' кстати)

1 голос
/ 23 сентября 2009

оформить драгоценный камень 'backports' :)

...