2016-05-19 58 views
2

我試圖編寫一個方法,將通過2d數組循環,並返回符合給定條件的元素的座標(在這種情況下,元素值== 1):評估值和返回二維數組中的座標

def eval(array) 
    array.each_index do |x| 
    x.each_index do |y| 
    if array[x][y] == 1 then 
     puts "X: #{x} Y: #{y}" 
    end 
    end 
end 
end 

array = [ 
[1, 0, 0, 0], 
[0, 1, 0, 0], 
[1, 0, 0, 1], 
[0, 1, 0, 0] 
] 
eval(array) 

我得到這個錯誤:

block in eval': undefined method `each_index' for 0:Fixnum (NoMethodError) 

什麼可能發生的任何提示?

+3

值得一提的是'eval'不是一個函數的好名字,因爲它與現有方法衝突。 – tadman

回答

4
array.each_index do |x| 

將此索引捕獲到x變量中,然後您試圖在編號上使用each_index。即

x.each_index do |y| 

修復這個問題給我們的功能:

def findMatchingCords(array) 
    array.each_index do |x| 
    array[x].each_index do |y| 
    if array[x][y] == 1 then 
     puts "X: #{x} Y: #{y}" 
    end 
    end 
end 
end 

現在findMatchingCords(陣列)產生

X: 0 Y: 0 
X: 1 Y: 1 
X: 2 Y: 0 
X: 2 Y: 3 
X: 3 Y: 1 

預期。

+0

謝謝!這絕對有效,我現在更清楚我是什麼,我循環與each_index循環。我正在考慮有關更改我的方法名稱的建議。 –

1

您可以使用Matrix類。

require 'matrix' 

def evaluate(array) 
    Matrix[*array].each_with_index { |e,x,y| puts "X: #{x} Y: #{y}" if e == 1 } 
end 

evaluate(array) 
X: 0 Y: 0 
X: 1 Y: 1 
X: 2 Y: 0 
X: 2 Y: 3 
X: 3 Y: 1 
+0

這個也很有用,謝謝你Cary。我寧願使用其他結構,因爲現在看起來對我來說更加自然,我剛剛開始使用Ruby,但我仍然不太願意用「rubysh」的方式思考。 –