ruby怎么创建singleton参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我已经看到如何将类定义为单例(如何在ruby中创建单例):

require 'singleton'

class Example
  include Singleton
end

但是如果我想给它一些参数给这个单一的实例,那么这个例子应该总是有一些初始化的属性。

class MyLogger
  def initialize(file_name)
    @file_name = file_name
  end
end

提问于
用户回答回答于

Singleton不提供这种功能,但不是使用单例,你可以自己写

class MyLogger
  @@singleton__instance__ = nil
  @@singleton__mutex__ = Mutex.new
  def self.instance file_name
    return @@singleton__instance__ if @@singleton__instance__
    @@singleton__mutex__.synchronize {
      return @@singleton__instance__ if @@singleton__instance__
      @@singleton__instance__ = new(file_name)
    }
    @@singleton__instance__
  end
  private
  def initialize file_name
    @file_name = file_name
  end
  private_class_method :new
end

它应该可以工作,但我没有测试代码。

MyLogger.instance <file_name>如果知道第一次调用,此代码会强制您使用或至少在第一次调用时使用。

用户回答回答于

这是另一种方法,将日志文件名称放在类变量中:

require 'singleton'
class MyLogger
  include Singleton
  @@file_name = ""
  def self.file_name= fn
    @@file_name = fn
  end
  def initialize
    @file_name = @@file_name
  end
end

现在你可以这样使用:

MyLogger.file_name = "path/to/log/file"
log = MyLogger.instance  # => #<MyLogger:0x000.... @file_name="path/to/log/file">

后续调用instance将返回路径名不变的同一对象,即使稍后更改类变量的值也是如此。另一个更好的方法是使用另一个类变量来跟踪一个实例是否已经被创建,并且file_name=在这种情况下该方法引发异常。initialize如果@@file_name尚未设置,也可能引发异常。

扫码关注云+社区