【问题标题】:Define Instance Variable Outside of Method Defenition (ruby)在方法定义之外定义实例变量(ruby)
【发布时间】:2011-02-01 18:45:11
【问题描述】:

我正在为 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

先谢谢了,嗯。

【问题讨论】:

    标签: ruby dynamic methods metaprogramming


    【解决方案1】:

    以下内容完全未经测试,但也许可以帮助您入门:

    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"]
    

    根据栏杆的评论编辑。

    【讨论】:

    • 确实如此。正如我所说,只是一个未经测试的快速拍摄,感谢您指出:-)
    • 它似乎适用于不需要初始化逻辑的类,这意味着我还需要做一个别名,这对我来说有点反红宝石,投入了比必要更多的工作,所以我会坚持手动添加它,也许我会找到一种方法,但现在直到我们再次见面:)
    【解决方案2】:

    我不完全理解您要做什么,但您可以通过以下方式避免使用initialize 方法:

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

    ||= 成语让您可以在 ruby​​ 中懒惰地初始化实例变量。

    【讨论】:

      猜你喜欢
      • 2018-02-09
      • 2016-06-17
      • 2023-04-09
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2021-06-13
      相关资源
      最近更新 更多