Определить переменную экземпляра за пределами определения метода (ruby) - PullRequest
2 голосов
/ 28 марта 2010

Я разрабатываю (ну, по крайней мере, пытаюсь) игровую среду для библиотеки Ruby Gosu. Я создал базовую систему событий, в которой каждый Blocks :: Event имеет список обработчиков, и когда событие вызывается, вызываются методы. На данный момент способ реализации события заключается в следующем:

class TestClass

    attr_accessor :on_close

    def initialize
        @on_close = Blocks::Event.new
    end

    def close
        @on_close.fire(self, Blocks::OnCloseArgs.new)
    end
end

Но этот метод реализации событий кажется довольно длинным, мой вопрос, как я могу сделать так, чтобы, когда кто-то хочет событие в классе, они могли просто сделать это

class TestClass

    event :on_close

    def close
        @on_close.fire(self, Blocks::OnCloseArgs.new)
    end
end

Заранее спасибо, эл.

Ответы [ 2 ]

2 голосов
/ 28 марта 2010

Следующее полностью не проверено, но, возможно, оно поможет вам начать:

class Blocks
  class Event
    # dummy 
  end
end

class Class
  def event(*args)
    define_method :initialize do
      args.each { |a| instance_variable_set("@#{a}", Blocks::Event.new) }
    end
  end
end

class TestClass
    event :on_close

    def close
      #@on_close.fire(self, Blocks::OnCloseArgs.new)
      p @on_close
    end
end

test = TestClass.new
test.close
# => #<Blocks::Event:0x10059a0a0>
p test.instance_variables
# => ["@on_close"]

Отредактировано согласно комментарию перила.

1 голос
/ 28 марта 2010

Я не совсем понимаю, что вы пытаетесь сделать, но вы можете избежать использования метода initialize следующим образом:

class TestClass

    event :on_close

    def close
        @on_close ||= Blocks::Event.new
        @on_close.fire(self, Blocks::OnCloseArgs.new)
    end
end

Идиома ||= позволяет лениво инициализировать переменные экземпляра в ruby.

...