gpt4 book ai didi

ruby - 在 ruby​​ 中仅在单例中实例化对象一次

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:31 24 4
gpt4 key购买 nike

过去几天我一直在研究这个基于工厂模式的类,您可以在其中注册类,为它们指定唯一的名称,然后使用它们动态创建对象。我的类(class)看起来是这样的:

module AisisWriter
class ClassFactory
class << self
undef_method :new
attr_accessor :registered_objects

def register(class_name, klass, params = nil)
if !params.nil? && !params.is_a?(Array)
raise ArgumentError, "Params must be an array."
end

if registered?(class_name)
raise ArgumentError, "Class name already registered."
end

@registered_object[class_name] = {:class_name => klass, :params => !params.nil? ? params.flatten : nil}
end

def registered?(class_name)
if @registered_object.nil?
return false
end

@registered_object.include? class_name
end

def create(class_name, params = nil)
if !params.nil? && !params.is_a?(Array)
raise ArgumentError, "Params must be an array."
end

if !registered?(class_name)
raise ArgumentError, "Class does not exist in the registered classes."
end

klass = @registered_object[class_name]

if !params.nil
klass[:class_name].new(params.flatten)
else
flass[:class_name].new(*klass[:params])
end
end

end
end
end

但是我有一些问题,是在编写测​​试时出现的。

  1. register(...) 函数中我做了:

@registered_object[class_name] = {:class_name => klass, :params => !params.nil? ? params.flatten : 无}
这失败了,因为 @registered_object 是 nil。如何只初始化一次?在 php 中我会写一个 getInstance() 方法并说如果设置了类实例,就不要再设置了,同时我们设置类实例的同时还设置了其他只需要设置一次的变量.我可以在这里使用 get_instance 方法吗?

  1. 关于第一个问题,我可以在 ruby​​ 中链接方法吗?因此,如果我需要获取此类的一个实例,它只需将 @registered_object 设置为 {} 一次,那么我可以这样做吗:AisisWriter::ClassFactory.get_instance .register(...) ruby​​ 支持吗?

这里的基础是确保在调用此类时,我们检查 @register_object 是否为 nil,如果是,则将其设置为 {} 的新实例

如果有更简单的解决方案,我会洗耳恭听。

最佳答案

你可以做到

def registered_object
@registered_object ||= {}
end

然后调用 registered_object 而不是 @registered_object

这是一个常见的 Ruby 习惯用法。这意味着:

If @registered_object is falsy, then set it to {}.

关于ruby - 在 ruby​​ 中仅在单例中实例化对象一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com