【问题标题】:initializing ruby singleton初始化红宝石单例
【发布时间】:2012-05-24 08:24:13
【问题描述】:

我正在尝试在 ruby​​ 中初始化一个单例。这是一些代码:

class MyClass
  attr_accessor :var_i_want_to_init

  # singleton
  @@instance = MyClass.new
  def self.instance
    @@instance
  end

  def initialize # tried 1. initialize, 2. new, 3. self.initialize, 4. self.new
    puts "I'm being initialized!"
    @var_i_want_to_init = 2
  end
end

问题是初始化永远不会被调用,因此单例永远不会被初始化。我尝试将init方法命名为initialize、self.initialize、new和self.new。没有任何效果。 “我正在初始化”从未打印出来,当我实例化时变量从未初始化

my_var = MyClass.instance

如何设置单例以使其初始化?感谢您的帮助,

帕春

【问题讨论】:

    标签: ruby singleton initialization rubymotion


    【解决方案1】:

    有一个standard library for singletons

    require 'singleton'
    
    class MyClass
      include Singleton
    end
    

    要修复您的代码,您可以使用以下内容:

    class MyClass
      attr_accessor :var_i_want_to_init
    
      def self.instance
        @@instance ||= new
      end
    
      def initialize # tried 1. initialize, 2. new, 3. self.initialize, 4. self.new
        puts "I'm being initialized!"
        @var_i_want_to_init = 2
      end
    end
    

    【讨论】:

    • 我应该说我无权访问标准库,因为它是 rubymotion。但是第二种方法奏效了,非常感谢。
    • 我不敢相信 RubyMotion 不支持标准库。对 gem 的支持有限,但是没有标准库的 Ruby 作为 Obj-C 的替代品并没有那么令人兴奋:没有套接字、没有 JSON、没有……?
    • Apple 在这方面做了很多:大量的套接字库(AFNetworking CFSocket)、NSJSONSerialization 等。人们开始将所有这些苹果提供的库打包成更类似于 ruby​​ 的语法。查找“ruby motion bubblewrap”
    • 使用标准Singleton模块时如何初始化实例变量?
    【解决方案2】:

    Rubymotion (1.24+) 现在似乎支持using GCD for singleton creation

    class MyClass
      def self.instance
        Dispatch.once { @instance ||= new }
        @instance
      end
    end
    

    【讨论】:

    • 很高兴知道,但几乎不相关
    • @sardaukar 这怎么不相关?这应该是公认的答案。
    • @RyanRomanchuk RubyMotion 是与 MRI 截然不同的运行时。这就是为什么我说它与 Ruby 问题的答案并不真正相关。 Ans 也 - 这个特定的答案仅适用于 Mac OS X。对吗?
    • 哦,OP 标记为 ruby​​motion,我认为这是一个 RM 问题,而不是 ruby​​。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2012-09-01
    • 2019-08-09
    相关资源
    最近更新 更多