2012-07-30 98 views
1

在下面的代碼中,海洋代表海底山脈的高度。亞特蘭蒂斯是各個地點的一組座標。我想總結一下atlantis引用的山峯高度。什麼是注射返回?和什麼可以在一個塊?

require 'matrix'  
Ocean=Matrix[ [3,1,4,4,6,2,8,12,8,2], 
     [6,2,4,13,25,21,11,22,9,3,], 
     [6,20,27,34,22,14,12,11,2,5], 
     [6,28,17,23,31,18,11,9,18,12], 
     [9,18,11,13,8,9,10,14,24,11], 
     [3,9,7,16,9,12,28,24,29,21], 
     [5,8,4,7,17,14,19,30,33,4], 
     [7,17,23,9,5,9,22,21,12,21,], 
     [7,14,25,22,16,10,19,15,12,11], 
     [5,16,7,3,6,3,9,8,1,5] ] 

atlantis=[[2,3],[3,4]] 




puts atlantis.inject {|sum, n| sum + Ocean[n(0),n(1)]} 

由於亞特蘭蒂斯是數組的數組中,n(0)應該是指第一元件,如圖2所示,第一陣列[2,3]的第一次注入確實塊。但錯誤,我得到

t1.rb:15:在block in <main>': undefined method N '主:對象(NoMethodError) 從t1.rb:15:在each' from t1.rb:15:in注入' 從t1.rb:15:在'」

似乎表明它甚至不知道「n」是什麼。我錯過了什麼?在這種情況下,n究竟代表什麼?

+3

用方括號數組元素引用'[]',而不是parens,例如'海洋[n [0],n [1]]'。 – maerics 2012-07-30 20:27:33

+1

添加摺疊的起始值:'inject(0)' – tokland 2012-07-30 20:30:31

回答

2

從Ruby documentation for Enumerable#inject(...),該函數返回將給定的二元運算符重複應用於種子和每個連續值的結果。所以返回值應該是塊過程(或符號)返回的類型的對象。在你的情況下,塊最終使用帶有數字參數的+運算符,所以返回的值應該是一個數字。

你應該通過提供種子值,並使用正確的語法爲數組查找修改您的嘗試:

atlantis.inject(0) { |sum,n| sum + Ocean[n[0],n[1]] } # => 65 

所以您的通話順序將是這個樣子:

# sum = seed = 0 (from .inject(0)) 
# sum = sum + Ocean[atlantis[0][0], atlantis[0][1]] = 34 
# sum = sum + Ocean[atlantis[1][0], atlantis[1][1]] = 34 + 31 
# sum = 65 
相關問題