讓我們來看看你的代碼仔細看看:
field=[[1,0],[0,0]]
coordindates = []
field.each_with_index do |item|
if item.index(1)
coordinates.push(field.index(item)).push(item.index(1))
end
end
讓:
enum = field.each_with_index
#=> #<Enumerator: [[1, 0], [0, 0]]:each_with_index>
正如你所看到的,這將返回一個枚舉器。
的Ruby看到你這樣的代碼:
enum.each do |item|
if item.index(1)
coordinates.push(field.index(item)).push(item.index(1))
end
end
枚舉的元素將被Enumerator#each被傳遞到塊,這將調用Array#each因爲接收器,field
是類Array
的一個實例。
我們可以通過將其轉換到陣列看到的enum
的元素:
enum.to_a
#=> [[[1, 0], 0], [[0, 0], 1]]
正如所看到的,它有兩個元件,兩個元件的每一個是一個陣列,第一個是兩個整數的數組第二個是整數。
我們可以通過發送Enumerator#next到enum
和分配塊變量由next
返回的值模擬each
操作。由於只有一個塊變量,item
,我們有:
item = enum.next
#=> [[1, 0], 0]
這很可能既不是你所期待也沒有人知道你想要的。
接下來,你item
調用Array#index:
item.index(1)
#=> nil
index
搜索數組item
爲等於1
的元素。如果它找到一個,它將返回數組中的該元素的索引。 (例如,item.index(0) #=> 1
)。由於[1,0]
和0
都不等於1
,因此index
返回nil
。
讓我們回顧(並重新創建枚舉器)。您需要兩個塊變量:
field.each_with_index do |item, index|...
這是一樣的:
enum.each do |item, index|...
所以現在:
item, index = enum.next
#=> [[1, 0], 0]
item #=> [1, 0]
index #=> 0
和
item.index(1)
#=> 0
我會讓你把它從這裏開始,但讓我再提一下NG。我不主張,但你可以寫:
在這種情況下
field.each_with_index do |(first, second), index|...
:
(first, second), index = enum.next
#=> [[1, 0], 0]
first #=> 1
second #=> 0
index #=> 0
++也許您的下一個答案可以包含一些牙線清單示例**^,,,^** – naomik 2015-04-06 04:28:08