如何知道实例是否已初始化?

时间:2014-06-27 14:49:45

标签: ruby

我们该怎么做:

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实例一样。

1 个答案:

答案 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_initrb_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}}不继承。我忘了。

实际上不需要使用别名和额外的方法。