只能在以下代码中的某些情况下调用链式方法.
class Klass
def foo
puts 'foo'
self
end
def bar
puts 'bar'
self
end
end
klass = Klass.new
a = 2
id = klass.foo{conditionally chain bar if a == 2}.bar
Run Code Online (Sandbox Code Playgroud)
您可以在有条件地继续或停止方法链的链式方法之间插入表达式或方法吗?
这很简单,在您立即理解之后将会到来:
klass = klass.foo
klass = klass.bar if a == 2
etc...
Run Code Online (Sandbox Code Playgroud)
如果链式方法不带参数,这很有效
klass.define_singleton_method :chain_if do |b, *s|
return unless b
klass = self
s.each do |x|
klass = klass.send x
end
klass
end
klass.foo.chain_if(true, :foo, :bar).chain_if(false, :bar)
Run Code Online (Sandbox Code Playgroud)
这里有一些重复的线程!
在这里,我发现了另一个我个人喜欢的解决方
my_object.tap{|o|o.method_a if a}.tap{|o|o.method_b if b}.tap{|o|o.method_c if c}
Run Code Online (Sandbox Code Playgroud)
编辑:
小心点击定义如下:
class Object
def tap
yield self
self
end
end
Run Code Online (Sandbox Code Playgroud)
如果链式方法返回一个新的不可变对象,那么您需要的内容可能如下所示:
class Object
def tap_and_chain
yield self
end
end
Run Code Online (Sandbox Code Playgroud)