任何类似于tap的标准方法但返回块结果而不是self?

时间:2016-11-13 23:53:22

标签: ruby

假设我有一系列以分钟表示的时间长度:

minutes = [20, 30, 80]

我想对数组内容求和并以<hours>:<minutes>格式输出结果。对于上面的示例,我希望结果为02:10

是否有任何标准的Ruby方法(即包含在core或std-lib中)允许在单行方法链中执行此操作? (即不使用变量来存储中间结果)。我的意思是:

puts minutes.reduce(:+).foomethod { |e| sprintf('%02d:%02d', e / 60, e % 60) }

foomethod 应该是什么? Object.tap 与我的需求非常接近,但遗憾的是它会返回self而不是block结果。

2 个答案:

答案 0 :(得分:3)

试试这个

puts sprintf('%02d:%02d', *minutes.reduce(:+).divmod(60))

答案 1 :(得分:3)

proc { |e| sprintf('%02d:%02d', e / 60, e % 60) }.call(minutes.reduce(:+)) #=>"01:00"

或者如果你喜欢lambdas

->(e) { sprintf('%02d:%02d', e / 60, e % 60) }.call(minutes.reduce(:+)) #=>"01:00"

PS:如果你想让它们更短,你也可以使用[].()来调用lambda,即

->(e) { sprintf('%02d:%02d', e / 60, e % 60) }.(minutes.reduce(:+)) #=>"01:00"
->(e) { sprintf('%02d:%02d', e / 60, e % 60) }[minutes.reduce(:+)] #=>"01:00"