方法级联可以在这里吗?

时间:2018-09-09 11:29:46

标签: ruby

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

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会按照文档中的说明返回自我,所以当我使用tab时我无法得到结果最终结果吗?无论如何,也可以在一行中实现此结果,而不必使用局部变量?

2 个答案:

答案 0 :(得分: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_selftap相似之处在于,它们都向该块产生self。区别在于两种方法分别返回什么。

Object#tap将自身产生到块,然后返回self Kernel#yield_self对块产生self,然后返回块的结果

Here's an answer是上一个问题,在此我给出了两个进一步的示例,说明每种方法在哪里有用。

答案 1 :(得分: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}]