Ruby Language Evaluer à l'intérieur d'une liaison


Exemple

Ruby conserve la trace des variables locales et self variables self via un objet appelé binding. Nous pouvons obtenir une liaison avec une portée en appelant la Kernel#binding et évaluer la chaîne à l'intérieur d'une liaison via Binding#eval .

b = proc do
  local_variable = :local
  binding
end.call

b.eval "local_variable" #=> :local

def fake_class_eval klass, source = nil, &block
  class_binding = klass.send :eval, "binding"

  if block
    class_binding.local_variable_set :_fake_class_eval_block, block
    class_binding.eval "_fake_class_eval_block.call"
  else
    class_binding.eval source
  end
end

class Example
end

fake_class_eval Example, <<-BLOCK
  def self.foo
    :foo
  end
BLOCK

fake_class_eval Example do
  def bar
    :bar
  end
end

Example.foo #=> :foo
Example.new.bar #=> :bar