每个切片或保留完整的数组

时间:2015-09-23 15:35:09

标签: arrays ruby

each_slice保留片长n,但在某些情况下我想保留完整的数组,即什么都不做。

module MyModule
  def num_slice
    some_boolean_test? ? :full_array : 10 # Note : the content of some_boolean_test? in uninteresting, just assume sometimes it ca return true or false
  end
end

class Foo
  include MyModule

  def a_method
    big_array.each_slice(num_slice) do |array_slice|
      # I want array_slice == big_array if num_slice returns :full_array
      ...
    end
  end
end

我可以在Array#each_slice周围编写一个包装器,这样当参数为:full_array时我就可以定义一个不同的行为。

有人可以提供帮助吗?

2 个答案:

答案 0 :(得分:4)

我首先要警告环境之间存在明显的逻辑差异,因为任何一个分支都经过较少的测试,或者您需要两倍的代码来维护。但是假设你采用这种方式的原因很充分,可以选择以下几种方法:

传递数组

由于num_slice正在对数组做出决定,因此num_slice应该可以访问它。{/ p>

def num_slice(arr)
  some_boolean_test? ? arr.size : 10
end

环境配置

您正在使用Rails,因此您可以在生产环境和其他环境中以不同方式设置切片大小。在生产中,将它10,并在测试中,使其任意大;然后只使用配置的值。这很好,因为没有代码差异。

def a_method
  big_array.each_slice(Rails.application.config.slice_size) do |array_slice|
    # ...
  end
end

包裹

我不推荐这种方法,因为它会导致你的环境之间产生最显着的差异,但是既然你问了这个问题,这就是一种方法。

def a_method
  magic_slice(big_array) do |array_slice|
    # ...
  end
end

def magic_slice(arr, &block)
  if some_boolean_test?
    block.call(arr)
  else
    arr.each_slice(10, &block)
  end
end

答案 1 :(得分:2)

def a_method(big_array, debug_context)
  num_slice = debug_context ? big_array.length : 10
  big_array.each_slice(num_slice) do |array_slice|
    # array_slice will equal to big_array if debug_context == true
    puts array_slice.inspect
  end
end

试验:

a_method([1,2,3,4,5], true)
[1, 2, 3, 4, 5]