1

在下面的代码中,Ocean 代表海底山脉的高度。亚特兰蒂斯是一组不同位置的坐标。我想总结一下亚特兰蒂斯所引用的山脉的高度。

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。但我得到的错误

t1.rb:15:in block in <main>': undefined methodn' for main:Object (NoMethodError) from t1.rb:15:in each' from t1.rb:15:ininjection' 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 回答