我这里有三行代码,如下所示
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时我无法得到结果最终结果吗?无论如何,也可以在一行中实现此结果,而不必使用局部变量?
答案 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_self
与tap
相似之处在于,它们都向该块产生self
。区别在于两种方法分别返回什么。
Object#tap
将自身产生到块,然后返回self 。 Kernel#yield_self
对块产生self,然后返回块的结果。
Here's an answer是上一个问题,在此我给出了两个进一步的示例,说明每种方法在哪里有用。
答案 1 :(得分:2)
使用数据执行工作代码通常会有所帮助,以便更好地了解要计算的内容。看到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}]