我正在尝试构建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
语句来构建用户交互部分,但是在找到拆分数组的方法时遇到了问题。如何开始迭代我的数组,从迭代中断开(请求用户输入),之后继续迭代我离开的地方?
答案 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)
您可以使用break
和next
。一个简短的演示 -
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"]
如何打印输出和/或用户提示取决于您。