您引用的是 Person 的同一个实例,而不是 Person 的一些新实例。
让我们挖掘:
[3] pry(main)> factory = {}
=> {}
[4] pry(main)> factory.object_id
=> 70344866826960
[5] pry(main)> class Person
[5] pry(main)* end
=> nil
[6] pry(main)> factory["make_person"] = Person.new
=> #<Person:0x007ff4e4136038>
Person被实例化了,我们来看看它的object_id:
[7] pry(main)> factory["make_person"].object_id
=> 70344887611420
让我们把它赋值给变量a:
[8] pry(main)> a = factory["make_person"]
=> #<Person:0x007ff4e4136038>
让我们将它分配给变量 b:
[9] pry(main)> b = factory["make_person"]
=> #<Person:0x007ff4e4136038>
现在 a 和 b 都指向同一个对象,如 object_id 所示
[10] pry(main)> a.object_id
=> 70344887611420
[11] pry(main)> b.object_id
=> 70344887611420
正如 Kris 所指出的,有几种方法可以让你获得这种行为,但以上内容对你来说很重要。
关于如何确保每次调用factory["make_person"] 时都会实例化一个新人的示例:
factory["make_person"] = lambda { Person.new }.call
=> #<Person:0x007ff4e0fa6ba8>