1

以下のコードで、Ocean は海底の山の高さを表します。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)]}

atlantis は配列の配列であるため、n(0) は最初の配列 [2,3] の最初の要素 2 を参照する必要があり、最初に inject がブロックを実行します。しかし、私が得るエラー

t1.rb:15:in block in <main>': undefined methodn' for main:Object (NoMethodError) from t1.rb:15:in each' from t1.rb:15:ininject' from t1.rb:15:in `'

「n」が何であるかさえ知らないことを示しているようです。私は何が欠けていますか?この場合、n は正確には何を取得/表すのでしょうか?

4

1 に答える 1

2

のRubyドキュメントから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
于 2012-07-30T20:32:08.373 に答える