Поиск…


Синтаксис

  • object.instance_eval 'code'
  • object.instance_eval 'code', 'filename'
  • object.instance_eval 'code', 'filename', 'number number'
  • object.instance_eval {code}
  • object.instance_eval {| receiver | код}

параметры

параметр подробности
string Содержит исходный код Ruby для оценки.
filename Имя файла, используемое для сообщений об ошибках.
lineno Номер строки, используемой для сообщений об ошибках.
block Блок кода для оценки.
obj Приемник передается блоку в качестве единственного аргумента.

Оценка экземпляра

Метод instance_eval доступен для всех объектов. Он оценивает код в контексте получателя:

object = Object.new

object.instance_eval do
  @variable = :value
end

object.instance_variable_get :@variable # => :value

instance_eval устанавливает self для object в течение всего блока кода:

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

Приемник также передается блоку в качестве единственного аргумента:

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

Метод instance_exec отличается в этом отношении: вместо этого он передает свои аргументы блоку.

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

Выполнение

Многие языки оснащены with утверждением , что позволяет программистам опускать приемник вызовов методов.

with может легко эмулироваться в Ruby с помощью instance_eval :

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

Метод with может использоваться для бесшовного выполнения методов на объектах:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow