我只是想知道即使這是Object的子類也是如此。
它通過undefining allocate
和new
工作。這裏的corresponding C code:
rb_undef_alloc_func(rb_cTrueClass);
rb_undef_method(CLASS_OF(rb_cTrueClass), "new");
您可以通過undef_method
在Ruby中實現類似的結果:
class FooClass
::FOO = new # <- this will be the only Foo instance
class << self
undef_method :allocate
undef_method :new
end
end
FooClass.new #=> NoMethodError: undefined method `new' for FooClass:Class
FooClass.allocate #=> NoMethodError: undefined method `allocate' for FooClass:Class
FOO #=> #<FooClass:0x007fddc284c478>
「相似」,因爲TrueClass.allocate
實際上並沒有提出一個NoMethodError
,但TypeError
:
TrueClass.allocate #=> TypeError: allocator undefined for TrueClass
不幸的是,rb_undef_alloc_func
在Ruby中不可用。我們可以通過重寫allocate
模仿行爲:
class FooClass
class << self
def allocate
raise TypeError, "allocator undefined for #{self}"
end
undef_method :new
end
end
FooClass.allocate #=> TypeError: allocator undefined for FooClass
不知道,哪種方式更乾淨。
上述變化阻止你通過new
創建一個實例,但也有其他的方法:
FOO #=> #<FooClass:0x007fddc284c478>
FOO.dup #=> #<FooClass:0x007fad721122c8>
FOO.clone #=> #<FooClass:0x007f83bc157ba0>
Marshal.load(Marshal.dump(FOO)) #=> #<FooClass:0x007f83bc13e330>
爲了考慮所有這些特殊情況,紅寶石」 STDLIB提供Singleton
模塊:
require 'singleton'
class Foo
include Singleton
end
它通過使allocate
和new
私有方法:(間)
Foo.new #=> NoMethodError: private method `new' called for Foo:Class
Foo.allocate #=> NoMethodError: private method `new' called for
,並將其添加instance
返回一個實例:(或的情況下,只有一個)
Foo.instance #=> #<Foo:0x007fdca11117e8>
你想要達到什麼目的? –
只是我很想知道它是如何禁止創建新的對象? – Sanjith
您是否閱讀過文檔? https://ruby-doc.org/core-2.2.0/TrueClass.html –