2015-10-04 214 views
0
out_file = File.open "out_file.txt" , 'w' do |f| 

matrix = [ 
    [1,2,3], 
    [4,5,6], 
    [7,8,9] 
] 

f.puts "matrix test" 

f.puts " int at [0,2]: #{matrix[0][2]}" 
f.puts " int at [2,0]: #{matrix[2][0]}" 
f.puts " int at {1,1]: #{matrix[1][1]}" 

以上代码生成这样的:红宝石阵列,[]操作

"matrix test 
int at [0,2]: 3 
int at [2,0]: 7 
int at {1,1]: 5" 

但是这个代码使用相同的矩阵变量声明..

rows = Array(0..3) 
cols = Array(0..3) 
rows.each do |r| 
    cols.each do |c| 
     f.puts "row:#{r} col:#{c} = #{matrix[r][c]},"  
    end 
end 

产生一个错误:

undefined method `[]' for nil:NilClass (NoMethodError)

有人可以告诉我什么是g在吗?

回答

1

问题是你的Array(0..3),它正在生成一个数组[0,1,2,3]而不是你想要的:[0,1,2]

你其实想用...Array(0...3) => [0,1,2]

或者你可以只改变内部0..2范围:Array(0..2) => [0,1,2]

检查出Range文档的详细信息。

0

有两种类型的范围,包括..和独家...,其中不包括最右边的数字。 范围如0..5将有每个数字包括5.(即。0,1,2,3,4,5) 范围如'0 ... 5'将有每个数字排除5.(即0,1,2,3,4)。 所以,如果你发现你的错误信息,

undefined method `[]' for nil:NilClass (NoMethodError) 

你需要开始怀疑什么可以在nil运行的方法。那么,你有这个矩阵声明:

matrix = [ 
[1,2,3], 
[4,5,6], 
[7,8,9] 
] 

所以,当这个范围会弹出表示为:

rows = Array(0..3) 

它会经过0,1,2,并且还3.嘛,该数组中没有3索引,因为你的数组从0开始计数到2结束。所以当3索引命中时,它的值超出了你声明的任何值 - 它是nil。当您尝试在其上运行该方法时(要调用所需数组中的点),错误消息告诉您无法在nil上运行方法(实际上为[])。

密切关注您的错误消息,以及理解两种类型的范围应该有助于您在未来发现这些类型的错误。如果这样做没有意义,请发表评论。

+0

许多THX。我确实有双点和三点算子混淆。 – warwick

+0

@warwick - 很高兴听到它的帮助。您可能想投票并接受最能够帮助您的答案(带有复选标记),以便与您有类似问题的其他人可以快速找到最佳答案。这也有助于您的声誉。 –

1

正如Tony所说,使用rows = Array(0..2)或rows = Array(0 ... 3)将会适用于您。

您也可以直接使用范围和放弃数组创建,像这样:

rows = 0...3 
cols = 0...3 
... 
0

以前的答案是正确的,但我想我会提高该方法的问题...

为什么要创建远程数组而不是使用矩阵数组的实际长度......?

也许会有这样的删除需要承担基质的组成:

out_file = File.open "out_file.txt" , 'w' do |f| 

matrix = [ 
    [1,2,3], 
    [4,5,6], 
    [7,8,9] 
] 

f.puts "matrix test" 

matrix.length.times do |r| 
    matrix[r].length.times do |c| 
     f.puts "row:#{r} col:#{c} = #{matrix[r][c]},"  
    end 
end