Domanda

class Foo
  def with_yield
    yield(self)
  end

  def with_instance_eval(&block)
    instance_eval(&block)
  end
end

f = Foo.new

f.with_yield do |arg|
  p self
  # => main
  p arg
  # => #<Foo:0x100124b10>
end

f.with_instance_eval do |arg|
  p self
  # => #<Foo:0x100124b10>
  p arg
  # => #<Foo:0x100124b10>
end

Perché il secondo ' p arg ' riporta l'istanza di Foo? Non dovrebbe riportare nil poiché with_instance_eval non restituisce self al blocco?

È stato utile?

Soluzione

Apparentemente in ruby ??1.8 instance_eval non cambia solo il valore di sé all'interno del blocco al suo ricevitore, ma produce anche quel valore. In 1.9 questo non è più il caso (arg sarà nulla qui), quindi quel comportamento non dovrebbe essere invocato (sono anche abbastanza sicuro che non sia documentato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top