这个 #divmod 方法正在做什么来输出这个结果?

jbk*_*jbk 2 ruby methods divmod

我有两个数组:

a = [7, 1, 65, 4, 13, 97]
b = []
Run Code Online (Sandbox Code Playgroud)

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

b << a.map(&4.method(:divmod))
Run Code Online (Sandbox Code Playgroud)

我期待的结果是:

b = [[1, 3], [0, 1], [16, 1], [1, 0], [3, 1], [24, 1]]
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

b = [[[0, 4], [4, 0], [0, 4], [1, 0], [0, 4], [0, 4]]]
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*fan 5

您得到的结果存在两个问题:

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

要修复(1),您必须分配结果而map不是附加结果,即

b = a.map(...)
Run Code Online (Sandbox Code Playgroud)

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

a.map { |n| 4.divmod(n) }
#=> [[0, 4], [4, 0], [0, 4], [1, 0], [0, 4], [0, 4]]
Run Code Online (Sandbox Code Playgroud)

而你想要:(请注意,n4现在已交换)

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

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

我不确定你的意思,但如果你不想有一个显式的块参数,你可以传递一个 proc 或 lambda &

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

b = a.map(&divmod4)
#=> [[1, 3], [0, 1], [16, 1], [1, 0], [3, 1], [24, 1]]
Run Code Online (Sandbox Code Playgroud)

不过,由于&divmod4会将proc 转换为块参数,所以上面相当于a.map { |n| n.divmod(4) }直接调用。仅当您想重用该过程时才需要这种方法,例如将其传递给不同的方法。