为什么带有块和.map的each_slice返回nil

时间:2014-01-28 21:07:00

标签: ruby enumerator

为什么这会返回nil,第2行是什么意思?该数组代表一个Sudoku难题的行,我正在尝试为其创建解决方案。

我在irb中尝试不同的方法,看看有多少种不同的方法可以查看数组。

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

1 个答案:

答案 0 :(得分:7)

有些方法需要一个块,如果没有提供块,它们会返回Enumerable

在您的示例中,您调用了map而未提供任何阻止。

但是你可以在枚举器上调用可枚举的方法。这允许您更改迭代器的行为。

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"]]

这是Ruby中稍微高级的主题之一,但互联网上有很多资源,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模块(使用mapeach_slice之类的方法。这就是乐趣开始的地方。如果我在我们的枚举器上调用任何这些方法(如{ {1}}),它不会像正常情况那样接收数组的每个元素,但每个元素都由枚举器“返回”,即每个单元素现在是9个元素的数组。

一如既往,我高度推荐Well Grounded Rubyist,在这里对这些主题进行了彻底的解释。 http://www.manning.com/black2/