假设我有一系列以分钟表示的时间长度:
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结果。
答案 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"