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)
我不明白为什么。谁能解释一下我不明白的地方?
(我必须使用&:,因为我需要使用此代码作为方法块参数。)
您得到的结果存在两个问题:
要修复(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)
而你想要:(请注意,n和4现在已交换)
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) }直接调用。仅当您想重用该过程时才需要这种方法,例如将其传递给不同的方法。