一次迭代数组n个项并继续迭代

时间:2017-10-04 03:57:37

标签: arrays ruby loops

我正在尝试构建CLI。我想打印存储在我的数组中的每个对象的名称。这就是我的数组的样子:

my_arr = [#<MyObject::Obj:0x007f828daf33b0>, #<MyObject::Obj:0x007f358daf33b0>..]

我希望用户一次只显示200/1000个名称,而不是一次显示长列表。这是我的代码:

my_arr.each_with_index do |my_obj, index|
  puts "#{index} #{my_obj.name}"
end

我正在考虑使用case语句来构建用户交互部分,但是在找到拆分数组的方法时遇到了问题。如何开始迭代我的数组,从迭代中断开(请求用户输入),之后继续迭代我离开的地方?

3 个答案:

答案 0 :(得分:1)

Ruby有一个Enumerable#each_slice方法,可以在组中为您提供一个数组,这可以让您做类似的事情:

my_arr = my_arr.collect.with_index do |my_obj, index|
  "#{index} #{my_obj.name}" # do this all the way up here to get the original index
end.each_slice(5)

length = my_arr.size - 1 # how many groups do we need to display
my_arr.each.with_index do |group, index|
  puts group.join("\n") # show the group, which is already in the desired format

  if index < length # if there are more groups to show,
                    # show a message and wait for input
    puts "-- MORE --"
    gets
  end
end

答案 1 :(得分:0)

您可以使用breaknext。一个简短的演示 -

def foo_next(arr)
  arr.each_with_index { |item, index| 
    next if index % 2 == 0
    puts item
  }
end


def foo_break(arr)
  arr.each_with_index { |item, index| 
    puts item
    break if index % 2 == 0
  }
end

nums = (1..10).to_a

foo_next(nums) # prints 2 4 6 8 10

foo_break(nums) # prints 1

答案 2 :(得分:0)

使用enumerator启用停止/继续过程:

arr = ('a'..'j').to_a
 #=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
enum = arr.to_enum

def taker n, enum
  n.times.with_object [] { |_, o| o << enum.next }
end

然后拿出你想要的多少元素......

taker 2, enum
 #=> ["a", "b"]

......从你离开的地方接走:

taker 3, enum
 #=> ["c", "d", "e"]
taker 1, enum
 #=> ["f"]

如何打印输出和/或用户提示取决于您。