在Ruby中执行每个操作,如何在每n个项目中放置一个br

鉴于我有10个要迭代的项目,我想像这个例子那样每3个放一个br。 我怎么能在Ruby中做到这一点?

1 2 3 
4 5 6
7 8 9
10

解决方案1

 (1..10).each_slice(3){|a| puts '
' unless a[0] == 1; puts a}

解决方案2 (ruby1.9.2)

 (1..10).chunk{|i| i.%(3).zero?}.each{|r, a| puts(a, *('
' if r))}

解决方案3

 puts (1..10).each_slice(3).map{|a| a.unshift('
')}.flatten.drop(1)

解决方案4 (ruby1.9.2)

 puts ['
'].product((1..10).each_slice(3).to_a).flatten.drop(1)

解决方案5

 puts (1..10).each_slice(3).with_object([]){|a, aa| aa.push('
', *a)}.drop(1)

解决方案6

 puts (1..10).map{|i| i.%(3).zero?? [i, '
'] : i}

解决方案7 (ruby1.9.2)

 puts (1..10).to_a. tap{|a| a.length.downto(1){|i| a.insert(i, '
') if i.%(3).zero?}}
  (1..10).each do |i| puts i puts '
' if i % 3 == 0 end
 >> (1..10).each_slice(3).to_a.map{|x|x.join("\n")}.join("\n
\n") => "1\n2\n3\n
\n4\n5\n6\n
\n7\n8\n9\n
\n10"

如果我理解这个问题,他并没有说元素总是(1..10),我在这里看到的大多数答案只对这个特定情况有效,因为它们依赖于元素的值,而不是在索引中。 一个更通用的解决方案,不仅可以在array = (1..10).to_a ,而且可以使用任何大小的任何数组:

 array.each_with_index do |o, i| puts o puts '
' if i % 3 == 2 end
 (1..10).each do |i| puts i if (i % 3 == 0) puts "
" end end

对于打印,我喜欢kurumi和DigitalRoss的组合:

 array.each_slice(3) {|elems| puts elems.join("\n"), '
' }

它非常具有说服力且非常简单。

 puts( (1..10) .each_with_index .map { |s, i| i % 3 == 2 ? [s, '
'] : s } .flatten .map(&:to_s) .join("\n") )
  • 这不依赖于初始值是整数。
  • 没有块的#each_with_index()返回一个生成器,这意味着你可以#map结果。
  • #flatten用于将’
    ‘移回内线。 您可以像这样修改字符串s"#{s}#{i % 3 == 2 ? "\n
    " : nil}"
    如果您不喜欢#flatten或者您不能#flatten由于某种原因(例如你已经使用嵌套数组)。
  • 最终的#map是为了确保在加入之前一切都是字符串。 如果你摆脱上面提到的#flatten ,那你就不需要了。

不那么ruby般的东西

 k = 3 while k < array.size arrays.insert(k,"
") k += 4 end p array

我建议做一个for(i=0;i