在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