我在讀Ruby中的單例。我從來沒有真正需要使用它們,但我很好奇,並決定查看它們,看看我是否應該在過去使用它們,或者如果我知道什麼他們用於。什麼時候在Ruby中使用Singleton類是明智的?
唯一的時候,我能想到的使用是這樣的:
- ?當我需要有一個特殊的對象。例如:「smart」
Hash
對象,它像一個普通的Ruby散列一樣具有一些額外的怪癖。 - 當我想這樣做時,只能存在一個類的一個實例。
但是,我不太確定我是否需要上述任何一種。
我在讀Ruby中的單例。我從來沒有真正需要使用它們,但我很好奇,並決定查看它們,看看我是否應該在過去使用它們,或者如果我知道什麼他們用於。什麼時候在Ruby中使用Singleton類是明智的?
唯一的時候,我能想到的使用是這樣的:
Hash
對象,它像一個普通的Ruby散列一樣具有一些額外的怪癖。但是,我不太確定我是否需要上述任何一種。
請注意,在Singleton模塊中混合的類在功能上等同於具有'class'方法的類或模塊,並且可以保證初始化調用或內聯初始化。比較這種用法辛格爾頓:
require 'singleton'
class Bar
include Singleton
attr_reader :jam
def initialize
@jam = 42
end
def double
@jam *= 2
end
end
b1 = Bar.instance
b1.double
b2 = Bar.instance
b2.double
p b1.jam #=> 168
這個沒有魔法模塊:
module Foo
@jam = 42
def self.double
@jam *= 2
end
def self.jam
@jam
end
end
Foo.double
Foo.double
p Foo.jam #=> 168
在你有一個全局對象維護狀態這兩種情況。 (因爲每一個常數,你在全球範圍內創建,其中包括類和模塊,是一個全局對象。)
唯一的功能差異是,與Singleton
你延遲對象的初始化的第一時間,直到你問吧。因此,如果你曾經在類或模塊上使用'class'方法,並且使用它們來改變對象的狀態(例如一個類跟蹤從它繼承的所有子類),你基本上使用一個單例。
就像你所說的,當你需要只有一個類的實例時,需要一個Singleton類。在一個被廣泛接受的框架中,Singleton類的一個很好的例子就是Rails Logger類。
您一直在Ruby中使用單例類。實際上,每個對象都有一個單例類。 (注意:出於性能方面的原因,實際上只有當你第一次訪問它們時纔會創建單例類,但這是性能優化。從語義上講,每次嘗試查看單例類時,它都會在那裏)。例如,「類方法」實際上並不存在於Ruby中。它們只是類對象的單例類的常規實例方法。 (它更容易說「class method」)
每次你用def foo.bar
語法定義一個方法時,你需要在單例類foo
上添加一個方法。
我意識到這一點,但我只是想不出一個時間,除了將它分配給一個類,這可能是一個具體的例子,除了將一個方法定義爲單個對象之外,這可能是一個具體的例子 – omninonsense
有時候,事實上只是純粹的「功能」,不屬於某個對象,也沒有任何狀態。但是你仍然想把它們放在一個名字空間中。例如,'Math'模塊。 –
啊,我真的用過了,現在我想到了。那麼,我現在感覺很傻。 :sadface: – omninonsense
你的第二個要點恰好就是要點。將單例類看作完全靜態的對象。 ruby中的Boolean和Null對象就是例子。
實際上,'true','false'和'nil'都是常規類的常規實例('TrueClass','FalseClass'和'NilClass')。他們*可能已經被定義爲單例類(並且這可能甚至是更好的設計),但是由於某些原因,它們不是。 –
你是在談論每個對象都有的單例類,還是你在談論Singleton庫,它允許你聲明一個僞全局類,並且只有一個實例有可能? – Phrogz
@Phrogz關於「Singleton庫,可以讓你聲明一個僞全局類,只有一個實例有可能嗎?」然而,我不知道這是一個圖書館?我認爲這是一個內置的紅寶石功能。 – omninonsense
我指的是[this module](http://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html),它是標準庫的一部分,與[singleton_class '](http://ruby-doc.org/core-1.9.3/Object.html#method-i-singleton_class)和相關的[方法](http://ruby-doc.org/core-1.9.3 /Object.html#method-i-singleton_methods)(這是Ruby核心的一部分)。 – Phrogz