2015-10-04 216 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