我有两个数组:

a = [7, 1, 65, 4, 13, 97]
b = []

我正在try 通过以下代码将a的每个元素的#divmod返回值附加到b中:

b << a.map(&4.method(:divmod))

我原以为结果是:

b = [[1, 3], [0, 1], [16, 1], [1, 0], [3, 1], [24, 1]]

但我得到的却是:

b = [[[0, 4], [4, 0], [0, 4], [1, 0], [0, 4], [0, 4]]]

我不明白为什么.有谁能解释一下我不明白的地方吗?

(我必须使用&:,因为我需要将此代码用作方法块参数.)

推荐答案

您得到的结果有两个问题:

  1. 您得到的数组有一层额外的嵌套
  2. (内部)值与预期不符

要修正(1),您必须将结果从map改为assign,而不是appending,即

b = a.map(...)

关于(2),您的代码相当于:

a.map { |n| 4.divmod(n) }
#=> [[0, 4], [4, 0], [0, 4], [1, 0], [0, 4], [0, 4]]

而你想要:(请注意,n4现在是互换的)

a.map { |n| n.divmod(4) }
#=> [[1, 3], [0, 1], [16, 1], [1, 0], [3, 1], [24, 1]]

我必须使用&:,因为我需要将此代码用作方法参数

我不确定这是什么意思,但如果您不想使用显式块参数,您可以使用&来传递proc或lambda:

divmod4 = ->(n) { n.divmod(4) }

b = a.map(&divmod4)
#=> [[1, 3], [0, 1], [16, 1], [1, 0], [3, 1], [24, 1]]

但是,由于&divmod4等于convert the proc to a block argument,所以上面的操作相当于直接调用a.map { |n| n.divmod(4) }.仅当您想要重用该过程时才需要此方法,例如,将其传递给不同的方法.

Ruby相关问答推荐

Ruby Case语句和固定,不适用于attr_reader

运行跳过的RSpec测试,如果通过则失败

判断一个数组是否是Ruby中另一个数组的子集

RSpec 是否有 python 类似功能来做 TDD?

仅在模块中列出方法?

在 Go (golang) 中编写一个 Ruby 扩展

Ruby 中是否有像 C 中一样的主要方法?

无法在 OSX Lion 上使用 RVM 安装 Ruby 企业版

为什么 RuboCop 建议用 Array.new 替换 .times.map?

如何让 Ruby 解析时间,就好像它在不同的时区一样?

如何在控制台中禁用 MongoDB 日志(log)消息?

从 Ruby 中的 DateTime 中减go n 小时

Ruby中的每个块都可以有一行吗?

将两个数组组合成哈希

rbenv install --list 不列出 2.1.2 版本

纯 Ruby 并发哈希

为什么 Ruby 文档中的方法前面有一个井号?

Ruby 中的 to_s 与 to_str(以及 to_i/to_a/to_h 与 to_int/to_ary/to_hash)

如何在没有 RVM 的 Ubuntu 上安装 Ruby 2

从数组 Ruby 中删除元素