在保留上下文重新评估功能的同时连接过程

时间:2015-11-21 19:26:13

标签: ruby metaprogramming proc

我想连接两个procs的主体。但与here不同的是,有一个转折点。由此产生的过程应该保留原始过程' instance_eval的 -Ability。

听起来有点令人困惑,所以这是我的用例。

我在Ruby中实现了另一种语言作为内部DSL。过度简化的实施:

class Interpreter
  def self.run(&program)
    Interpreter.new.instance_eval(&program)
  end

  def initialize
    @variables = {}
  end

  def assign_variable(name, value)
    @variables[name] = value
  end

  def display(name)
    puts @variables[name]
  end
end

Interpreter.run do
  assign_variable :foo, 42
  display :foo
end

如果我将proc的主体分成另外两个:

assignment = proc { assign_variable :foo, 42 }
printing   = proc { display :foo }
combined   = proc { assignment.call; printing.call }

Interpreter.run(&combined)

它不起作用,因为combined proc是 instance_eval -ed,但assignmentprinting过程在它们的位置上下文中进行评估被定义了。

我想分割原始过程的原因是我可以干我的测试。

1 个答案:

答案 0 :(得分:1)

你可以做到

combined = proc {
  instance_eval &assignment
  instance_eval &printing
}

但如果有人提出更具惯用性的话,我不会感到惊讶