有条件地调用链式方法

kre*_*eek 3 ruby

只能在以下代码中的某些情况下调用链式方法.

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)

您可以在有条件地继续或停止方法链的链式方法之间插入表达式或方法吗?

Dam*_*fie 5

这很简单,在您立即理解之后将会到来:

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)

  • `tap`会返回`my_object`.`o.method_a`的结果将被丢弃. (2认同)