Ricerca…


Sintassi

  • object.instance_eval 'code'
  • object.instance_eval 'code', 'filename'
  • object.instance_eval 'code', 'filename', 'numero di riga'
  • object.instance_eval {code}
  • object.instance_eval {| receiver | codice }

Parametri

Parametro Dettagli
string Contiene il codice sorgente di Ruby da valutare.
filename Nome del file da utilizzare per la segnalazione degli errori.
lineno Numero di riga da utilizzare per la segnalazione degli errori.
block Il blocco di codice da valutare.
obj Il ricevitore viene passato al blocco come unico argomento.

Valutazione delle istanze

Il metodo instance_eval è disponibile su tutti gli oggetti. Valuta il codice nel contesto del destinatario:

object = Object.new

object.instance_eval do
  @variable = :value
end

object.instance_variable_get :@variable # => :value

instance_eval imposta self per object per la durata del blocco di codice:

object.instance_eval { self == object } # => true

Il destinatario viene anche passato al blocco come unico argomento:

object.instance_eval { |argument| argument == object } # => true

Il metodo instance_exec differisce in questo senso: passa invece i suoi argomenti al blocco.

object.instance_exec :@variable do |name|
  instance_variable_get name # => :value
end

Implementazione con

Molte lingue sono dotate di with dichiarazione che consente ai programmatori di omettere il ricevitore di chiamate di metodo.

with può essere facilmente emulato in Ruby usando instance_eval :

def with(object, &block)
  object.instance_eval &block
end

Il metodo with può essere utilizzato per eseguire senza problemi metodi sugli oggetti:

hash = Hash.new

with hash do
  store :key, :value
  has_key? :key       # => true
  values              # => [:value]
end


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow