我在这里有三行代码,如下所示
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.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上一个问题,我给出了几个进一步的例子,说明这些方法中的每一个都有用。
使用数据执行工作代码通常很有帮助,以便更好地理解要计算的内容。看到transpose
和zip
,它们通常是可互换的,一起使用,这是一种简化可能的线索(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}]