方法级联是可能的吗?

问题描述 投票:1回答:2

我在这里有三行代码,如下所示

local = headers.zip(*data_rows).transpose
local = local[1..-1].map {|dataRow| local[0].zip(dataRow).to_h}
p local

现在,如果你观察上面三行,我必须将第一行的结果存储在名为local的变量中,因为它将在第二行的两个地方使用,如我所示,所以我不能级联第二行无论如何还是第一线?我试过用这样的水龙头

local = headers.zip(*data_rows).transpose.tap{|h|h[1..-1].map {|dataRow| h[0].zip(dataRow).to_h}}

tap正如文档中所解释的那样返回self,所以当我使用tab时,我无法获得结果的最终结果?无论如何其他方式在一行中实现这个结果,这样我就不必使用局部变量了?

ruby
2个回答
4
投票

如果您使用的是Ruby 2.5.0或更高版本,则可以使用yield_self

local = headers.zip(*data_rows).transpose.yield_self { |h| h[1..-1].map { |dataRow| h[0].zip(dataRow).to_h } }

yield_self类似于tap,因为他们都产生self块。区别在于两种方法中的每种方法返回的内容。

Object#tap产生自我到块,然后返回自我。 Kernel#yield_self向块生成self,然后返回块的结果。

Here's an answer上一个问题,我给出了几个进一步的例子,说明这些方法中的每一个都有用。


2
投票

使用数据执行工作代码通常很有帮助,以便更好地理解要计算的内容。看到transposezip,它们通常是可互换的,一起使用,这是一种简化可能的线索(a = [1,2,3]; b = [4,5,6]; a.zip(b) => [[1, 4], [2, 5], [3, 6]] <= [a,b].transpose)。

这是我的数据:

headers=[1,2,3]
data_rows=[[11,12,13],[21,22,23],[31,32,33],[41,42,43]]

这是工作代码返回的内容:

local = headers.zip(*data_rows).transpose
local[1..-1].map {|dataRow| local[0].zip(dataRow).to_h}
  #=> [{1=>11, 2=>12, 3=>13}, {1=>21, 2=>22, 3=>23},
  #    {1=>31, 2=>32, 3=>33}, {1=>41, 2=>42, 3=>43}]

似乎可以更简单地计算:

data_rows.map { |row| headers.zip(row).to_h }
  #=> [{1=>11, 2=>12, 3=>13}, {1=>21, 2=>22, 3=>23},
  #    {1=>31, 2=>32, 3=>33}, {1=>41, 2=>42, 3=>43}]
© www.soinside.com 2019 - 2024. All rights reserved.