偶尔写Ruby的时候我发现自己想要一个pipe
方法,类似于tap
,但是返回用self
作为参数调用块的结果,如下所示:
class Object
def pipe(&block)
block.call(self)
end
end
some_operation.pipe { |x| some_other_operation(x) }
..但到目前为止,我还没有设法找出它的名称,如果存在的话。它存在吗?
如果没有,我知道我可以通过猴子补丁来添加它,但是,你知道,这很糟糕。除非有一个辉煌的,保证永不冲突(和描述性和简短)的名称,我可以用它...
Ruby 2.5 introduced Object.yield_self,它正是您正在使用的管道运算符:它接收一个块,将self作为第一个参数传递给它,并返回计算块的结果。
class Object
def yield_self(*args)
yield(self, *args)
end
end
用法示例:
"Hello".yield_self { |str| str + " World" }
# Returns "Hello World"
您还可以在以下博客文章中阅读更多相关信息:
这是我用来链接对象的技术。除了我不重新打开Object
类之外,它几乎与上面完全一样。相反,我创建了一个Module
,我将用它来扩展我正在使用的任何对象实例。见下文:
module Chainable
def as
(yield self.dup).extend(Chainable)
end
end
我已经定义了这种方法来禁止变异方法改变原始对象。以下是使用此模块的一个简单示例:
[3] pry(main)> m = 'hi'
=> "hi"
[4] pry(main)> m.extend(Chainable).as { |m| m << '!' }.as { |m| m+'?'}
=> "hi!?"
[5] pry(main)> m
=> "hi"
如果有人发现此代码有任何问题,请告诉我!希望这可以帮助。