суббота, 7 июня 2008 г.

понедельник, 2 июня 2008 г.

эх, красота

Кайф, это среди ночи и желтых фонарей проноситься по лужам, километрах эдак на 35, когда поднимаемые тучи брызг сливаются с каплями дождя, превращаясь в прохладную водяную подушку, и из всех звуков слышать только шелест воды и гул покрышек велосипеда.

хочется странного

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