Ruby:如何将对象传递给块并根据对象 return 计算值?

Ruby: how to pass object to a block and return a calculated value depending on the obj?

我想做类似的事情:

seconds=Time.parse("0:26:29.489").magic{|z| z.hour+z.min+z.sec+z.nsec.fdiv(1_000_000)}

将时间戳转换为秒(也有分数),而不是写:

d=Time.parse("0:26:29.489")
seconds=d.hour+d.min+d.sec+d.nsec.fdiv(1_000_000)

备用临时 "d" 变量。但是 "magic" 如果有的话,我应该用什么?

Ruby 有 tap,但这对您没有帮助。你想要的是一个叫做 pipe 的东西,但遗憾的是它不在那里。至少不是没有 a gem that monkey patches Object。虽然我觉得应该是。

您可以创建一个 lambda 并立即调用它,这将避免中间变量(或者至少将它包含在 lambda 的块范围内,如您的 magic 示例),但我不确定你获得了很多,并且可能会坚持你所拥有的。 lambda 方法如下所示:

# will return the value for "seconds"
->(d) { d.hour+d.min+d.sec+d.nsec.fdiv(1_000_000) }.(Time.parse("0:26:29.489"))