初始化Ruby单例模式

7
我正在尝试在Ruby中初始化单例。以下是一些代码:

我正在尝试在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

问题在于 initialize 方法从未被调用,因此单例模式从未初始化。我尝试过将 init 方法命名为 initialize、self.initialize、new 和 self.new,但都没有成功。当我实例化时,“正在初始化”从未打印,并且变量也从未被初始化。
my_var = MyClass.instance

我应该如何设置单例才能使其初始化? 感谢您的帮助,
Pachun
2个回答

18

有一个用于单例的标准库:

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。但第二种方法很有效,非常感谢你。 - pachun
我简直不敢相信RubyMotion竟然没有支持标准库。尽管gems得到了有限的支持,但是没有标准库的Ruby并不能作为Obj-C的替代品那么令人兴奋:没有sockets, 没有JSON等等...? - Koraktor
苹果公司在这方面做了很多工作:有很多套接字库(AFNetworking CFSocket)、NSJSONSerialization等。人们开始将所有这些由苹果提供的库打包成更类似于Ruby语法的形式。搜索“ruby motion bubblewrap”。 - pachun
3
使用标准 Singleton 模块时,如何初始化实例变量? - Dor

6

好知道,但几乎不相关。 - Bruno Antunes
@sardaukar 这怎么不相关呢?这应该是被接受的答案。 - Ryan Romanchuk
1
RubyMotion是一种与MRI非常不同的运行时环境。这就是为什么我说它不是一个真正相关的答案来回答一个Ruby问题。而且,这个特定的答案只适用于Mac OS X。对吧? - Bruno Antunes
哦,原帖标记了Rubymotion,我以为这是一个RM问题,而不是Ruby问题。 - Ryan Romanchuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接