在类的主体中,我想将一个块传递给一个名为with的方法在块的生命周期中,我希望有一个with_value方法可用。
否则,块内的所有内容都应表现为块外。
下面是一个例子:

class C
  extend M

  with "some value" do
    do_something_complicated
    do_something_complicated
    do_something_complicated
  end
end

我们几乎可以通过:
module M
  def with(str, &block)
    Object.new.tap do |wrapper|
      wrapper.define_singleton_method :with_value do  # Here's our with_value
        str                                           # method.
      end
    end.instance_eval &block
  end

  def do_something_complicated                        # Push a value onto an
    (@foo ||= []).push with_value                     # array.
  end
end

但有一个问题:由于我们正在评估传递给另一个对象上下文中的with的块,do_something_complicated不可用。
什么才是正确的方法?

最佳答案

这将使with_value仅在块内可用但是,_with_value将在块内或块外定义。

module M
  def _with_value
    ...
  end
  def with(str, &block)
    alias with_value _with_value
    block.call
    undef with_value
  end
  ...
end

我无法从这个问题中看出这是否是个问题如果这是一个问题,你需要进一步描述你想做什么。

关于ruby - 如何制作在块的整个生命周期内都可以使用的Ruby方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23295622/

10-13 01:27