我们该怎么做:
instance = Object.allocate ## Doesn't call initialize(). Object is just a sample class.
...
# Somewhere instance would get itself initialized. I do magic.
...
instance.initialized? ## There's no method like that.
当然我问这不想在任何地方使用旗帜。我想知道默认行为的一般解决方案,就像它可以用于简单的Object实例一样。
答案 0 :(得分:0)
所以我实际上最终得到了这个解决方案。我仍然愿意接受建议。
class ::Object
def object(name, klass = Object, &block)
instance = klass.allocate
if instance.method(:initialize).owner == BasicObject
instance.instance_exec(&block) if block_given?
else
raise "No block given." unless block_given?
instance.instance_exec do
def initialize(*args)
@__initialized = true
super
end
end
instance.instance_exec(&block)
instance.instance_exec do
raise "Instance of #{klass} needs to be initialized." unless @__initialized
remove_instance_variable :@__initialized
end
end
(self.is_a?(Module) ? self : self.class).const_set(name, instance)
end
end
我可以像
一样使用它object :Hey, SomeClassWithInitialize do
puts "Perhaps sometimes I'd be doing some things first before initializing."
initialize
puts "And other things after initializing."
def hey!
puts "Hey!"
end
end
Hey.hey!
更新:事实证明Ruby中确实没有函数声明一个initialize
被调用的标志。从rb_obj_call_init
到rb_obj_dummy
的所有来电都不会对此产生重大影响。
我可能只考虑使用简单的单例为实例即̶d̶o̶e̶s̶n̶'̶t̶继承任何东西,̶和̶̶S̶i̶n̶g̶l̶e̶t̶o̶n̶#̶i̶n̶s̶t̶a̶n̶c̶e̶
̶对事情的移到该方法,但它只会得出结论,当我实际使用̶o̶n̶e̶.̶类声明Singleton与{{3}}不继承。我忘了。
实际上不需要使用别名和额外的方法。