class ActionHolder
def initialize
@my_id = rand(100000)
@actions = []
end
def add_action(&block)
@actions.push( block )
end
def process
@actions.each{ |a|
a.call
}
end
end
ah = ActionHolder.new
ah.add_action{
puts "I'm the action"
puts "my holder ID is: #{@my_id}"
}
ah.process
Можно код передавать строкой и эвалить внутри класса, но:
- теряется проверка синтаксиса до эвала
- в редакторе не подсвечивается синтаксис внутри строки
- бэктрэйс с эвалами труднопонимаем
Upd:
Днем был тупняк. во время определения лямбды, @my_id ссылается на nil т.к. никто такой переменной в контексте не обьявлял, а преобразование из текста "@my_id" во внутреннее представление, похоже, происходит 1 раз, во время создания. Этож не eval.
class ActionHolder
def initialize
@my_id = rand(100000)
@actions = []
@@Getter = proc do |var_name|
raise "instance variable '#{var_name}' not defined" \
if !self.instance_variables.include? var_name
self.instance_variable_get( var_name )
end
end
def add_action(&block)
@actions.push( block )
end
def process
@actions.each{ |a|
a.call( @@Getter )
}
end
end
ah = ActionHolder.new
ah.add_action{ |obj|
puts "I'm the action"
puts "my holder ID is: #{obj['@my_id']}"
}
ah.process
Комментариев нет:
Отправить комментарий