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
时我就可以定义一个不同的行为。
有人可以提供帮助吗?
答案 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]