如何在Ruby中打印多维数组?

8
什么是在Ruby中打印多维数组的首选方法?
例如,假设我有这个二维数组:
x = [ [1, 2, 3], [4, 5, 6]]

我尝试打印它:

>> print x
123456

同时,以下也是不可行的:
>> puts x
1
2
3
4
5
6

哦,我以为你是指像网格一样排列。没关系。 - Dave Newton
6个回答

14
如果你只是想要易于阅读的调试输出,那么 "p" 很有用(它会在数组上调用 inspect() 方法)。
p x
[[1, 2, 3], [4, 5, 6]]

7

两种选择:

p x

-或者-

require 'pp'

. . .        

pp x

+1 因为提到了“pp”,我甚至不知道它的存在。对于 Ruby 1.9.2,它似乎与 inspect 在这个例子中做的事情相同。 - spike

6

如果您想将多维数组作为二维图形的可视化呈现,以下方法非常适用:

x.each do |r|
  puts r.each { |p| p }.join(" ")
end

然后您在终端中会看到类似以下内容:
  1 2 3
  4 5 6
  7 8 9

.map { |p| p }” 的作用是什么?! - muichkine
谢谢留言。你可以使用each而不是map。我会编辑示例以使用each,因为它更适合这个目的。 - ogoldberg

4

PrettyPrint是Ruby自带的工具,可以帮助您完成这个任务:

require 'pp'
x = [ [1, 2, 3], [4, 5, 6]]
pp x

然而,在Ruby 1.9.2中(如果可能的话,应该尝试使用),输出会自动进行此操作:
ruby-1.9.2-p290 :001 > x = [ [1, 2, 3], [4, 5, 6]]
 => [[1, 2, 3], [4, 5, 6]] 
ruby-1.9.2-p290 :002 > p x
[[1, 2, 3], [4, 5, 6]]
 => [[1, 2, 3], [4, 5, 6]] 

2

遍历“封闭”数组中的每个条目。该数组中的每个条目都是另一个数组,因此也要对其进行迭代。打印输出或使用join函数。

arr = [[1, 2, 3], [4, 5, 6]]

arr.each do |inner|
  inner.each do |n|
    print n # Or "#{n} " if you want spaces.
  end
  puts
end

arr.each do |inner|
  puts inner.join(" ") # Or empty string if you don't want spaces.
end

2

实现这一点的“基本”方法,以及IRB所采用的方法,是打印#inspect的输出:

ruby-1.9.2-p290 :001 > x = [ [1, 2, 3], [4, 5, 6]]
 => [[1, 2, 3], [4, 5, 6]] 
ruby-1.9.2-p290 :002 > x.inspect
 => "[[1, 2, 3], [4, 5, 6]]"

pp 产生的输出略微更加美观。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接