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

 北辰孤星123 发布于 2023-01-30 18:05

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

我在irb中尝试不同的方法来查看我可以查看数组的不同方法.

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

Ernest.. 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中稍微高级的主题之一,但互联网上有很多资源,如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个元素的数组.

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

1 个回答
  • 有些方法需要一个块,如果没有提供块,它们会返回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中稍微高级的主题之一,但互联网上有很多资源,如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个元素的数组.

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

    2023-01-30 18:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有