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
产生错误:
未定义的方法`[]'为nil:NilClass(NoMethodError)
有人可以告诉我发生了什么事吗?
答案 0 :(得分: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的文档。
答案 1 :(得分:1)
正如Tony建议的那样,使用rows = Array(0..2)或rows = Array(0 ... 3)将适合你。
您也可以直接使用范围并放弃数组创建,如下所示:
rows = 0...3
cols = 0...3
...
答案 2 :(得分: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.所以当{{1}时} index hits,它的价值超出你宣布的任何东西 - 它的3
。当您尝试在其上运行该方法时(为了调用您想要的数组中的位置),错误消息会告诉您无法在{{{{{}上运行nil
实际上的方法1}}。
密切关注您的错误消息,以及了解这两种类型的范围应该可以帮助您在将来捕获这些类型的错误。如果这没有完全意义,请发表评论。
答案 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