2014-01-28 104 views
3

爲什麼這會返回零,第2行是什麼意思?該數組表示一個Sudoku難題的行,我試圖爲其創建一個解決方案。爲什麼帶block和.map的each_slice返回nil

我想在irb中使用不同的方法來查看有多少種不同的方法可以查看數組。

array = ['015003002000100906270068430490002017501040380003905000900081040860070025037204600'] 
array.each_slice(9) { |e| puts e.map } 
#<Enumerator:0x0000010288a470> 
=> nil 
+0

您的數組只有一個項目? –

回答

6

某些方法需要一個塊,如果沒有提供塊,則返回Enumerable

在您的示例中,您調用了map而未提供任何塊。

但是你可以在枚舉器上調用enumerable方法。這允許你改變迭代器的行爲。

array[0].split('').each_slice(9).map { |el| el } 

=> [["0", "1", "5", "0", "0", "3", "0", "0", "2"], 
["0", "0", "0", "1", "0", "0", "9", "0", "6"], 
["2", "7", "0", "0", "6", "8", "4", "3", "0"], 
["4", "9", "0", "0", "0", "2", "0", "1", "7"], 
["5", "0", "1", "0", "4", "0", "3", "8", "0"], 
["0", "0", "3", "9", "0", "5", "0", "0", "0"], 
["9", "0", "0", "0", "8", "1", "0", "4", "0"], 
["8", "6", "0", "0", "7", "0", "0", "2", "5"], 
["0", "3", "7", "2", "0", "4", "6", "0", "0"]] 

它的紅寶石更高級一些的話題之一,但在互聯網上,f.i.有大量的資源http://www.sitepoint.com/guide-ruby-collections-iii-enumerable-enumerator/

編輯:

只是爲了回答註釋的問題:你只有一個在array長字符串。我不問爲什麼,但只是爲了舉一些例子,我需要實際的(字符串?)數組。 array[0]將數組中的第一個元素(數字的長串)。當我有一個字符串時,我可以調用String#split來獲得一個像[[「0」,「1」,「5」,「...」]的數組。

Array包括Enumerable模塊,這要歸功於你可以調用方法如each_slice就可以了。作爲文檔狀態(http://rubydoc.info/stdlib/core/Enumerable:each_slice):

如果沒有塊給出,返回一個枚舉

所以調用each_slice(9)後,我得到Enumerator實例(http://rubydoc.info/stdlib/core/Enumerator)。它有一些自己的方法,但也包括Enumerable模塊(使用方法如map,each_slice。這裏是樂趣開始的地方,如果我在枚舉器上調用任何這些方法(如map),它將不會接收到數組的每個元素,像在正常情況下,但是每個元件由枚舉「返回」,即,每個單獨的元件現在是9個元素的數組。

一如既往我高度推薦良好接地Rubyist,其中這樣的受試者中充分解釋。http://www.manning.com/black2/

+0

Thanks.So'split'將數組中的每個數字轉換爲它自己的字符串'eac h_slice'然後遍歷拆分數組,然後創建9個數組,每個數組中有9個元素?對不起,困惑。是否使用塊切片將map數組映射到9次? 'array'後面的'[0]'是做什麼的? – HandDisco

+0

@Abraham看到我的編輯。 – Ernest

+0

感謝您的詳細回覆!我會讀。 – HandDisco

相關問題