溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Singleton Class的對象模型設(shè)計有哪些

發(fā)布時間:2022-01-14 09:06:59 來源:億速云 閱讀:123 作者:iii 欄目:大數(shù)據(jù)

這篇“Singleton Class的對象模型設(shè)計有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Singleton Class的對象模型設(shè)計有哪些”文章吧。

  class << self; self; end

這段代碼,每個Rubyist應(yīng)該都很熟悉。
但是這里面的self是什么? singleton_class? meta_class? eigen_class?

在早期,確切來說應(yīng)該是Ruby1.9.2發(fā)布之前,Ruby社區(qū)關(guān)于以上這段代碼的命名,有很大的爭議,后來Ruby團(tuán)隊準(zhǔn)備在1.9.2中增加一個方法,來消除這種命名的爭議。 這個名字除了Ruby官方的統(tǒng)一之外,更重要的是為了方便Rubyist去使用。比如,1.9.2之前的代碼:

(class << self; self; end).class_eval do
  define_method meth do |*args|
    subject.send meth, *args
  end
end

或者有更優(yōu)雅的寫法:

 
def metaclass
  class << self; self; end
end

metaclass.class_eval do
  define_method meth do |*args|
    subject.send meth, *args
  end
 end

這個metaclass是社區(qū)里其中一個命名,還有命名為eigen_class的, 在Ruby內(nèi)部,被命名為virtual class, 有代碼為證:

 
#ruby 1.8.7  
class User
  class << self
    puts self
    puts self.new
  end
end
#=> #<Class:User>
#=> TypeError: can't create instance of virtual class

報錯的信息顯示,Ruby內(nèi)部稱之為:virtual class。

當(dāng)然,在Ruby1.9.2之后, 確定了名字,叫做singleton_class, 代碼為證:

 
class User
  class << self
    puts self
    puts self.new
  end
end
#=> #<Class:User>
#=> TypeError: can't create instance of singleton class

并且提供了一個方法,Object#singleton_class, 這是一個短形式,相當(dāng)于你直接使用(class << self; self; end)

 
Object.instance_methods.grep(/class|singleton|eigen|meta/)
#=> [:class, :singleton_class, :singleton_methods, :define_singleton_method]

關(guān)于這個命名,社區(qū)里還是有一些爭議的, 可以看這個帖子。

有的人說用metaclass, metaclass翻譯成中文就是元類, 意思就是,一個類自己的類,但是明顯不符合事實,因為在Ruby中,對于類還可以用這個命名,但是對象呢?每個對象都有這樣一個類(class << self; self; end), 自然,metaclass就被否決了。

有的人說用eigen_class,翻譯為中文就是本質(zhì)類,也可以叫固有類,有點偏語義、偏哲學(xué)層面,用這個名字其實也可以。但是,在Ruby里已經(jīng)有了一個方法,叫singleton_methods,專門用于查看eigen_class這樣的類中定義的方法, 難道要把singleton_methods改稱eigen_methods嗎? 或者叫eigenclass? eigenmethods? 就這樣Ruby核心團(tuán)隊陷入了深深的困擾中。

其實最受歡迎的命名還是singleton_class, 但是這個命名有很大的歧義,那就是容易讓人聯(lián)想到設(shè)計模式 - 單例模式上面去。不知道這個設(shè)計模式的還好,知道這個設(shè)計模式的,第一印象就以為是單例模式,尤其是國內(nèi),把singleton_class翻譯為單例類讓人更加困擾,但實際上,這個singleton_class和單例模式?jīng)]有什么關(guān)系, 我們只能從這個命名的英文含義去理解, 個人認(rèn)為中文翻譯為單例類不太好,應(yīng)該翻譯為單類,因為singleton_class是指Ruby中每個對象都對應(yīng)的那個特殊的類,就像影子一樣跟著Ruby中的每一個對象,形單影只,所以有人也把它叫做影子類。 所以,這些因素都是Ruby團(tuán)隊需要考慮的。

但是最后的決定,還是用了singleton_class,因為Ruby團(tuán)隊不想去改已經(jīng)實現(xiàn)的singleton_methods等帶著singleton_前綴的方法了。

這里提一下,「Ruby元編程」中用的是eigenclass,作者說對于這個名字,官方并未定論,按理說在他寫這本書之前,應(yīng)該1.9.2還未發(fā)布,但是2011年這本書出版的時候,Ruby1.9.2應(yīng)該早出版了,singleton_class應(yīng)該就是官方對于(class << self; self; end)的定論了。

值得一提的是,Ruby標(biāo)準(zhǔn)庫里有一個Singleton Moudle,這個才是真正用于去實現(xiàn)單例模式的。

那么現(xiàn)在,我們要動態(tài)的創(chuàng)建一個類或?qū)ο蟮姆椒?,可以方便的去使用singleton_class了:

 
singleton_class.class_eval do
  define_method meth do |*args|
    subject.send meth, *args
  end
end

關(guān)于singleton class的更多示例:

 
class User
  def self.name
    puts "hello"
  end
  
  class << self
    def age
      puts  "18 years old"
    end
  end
end

User.singleton_methods #=> [:name, :age]

user = User.new
def user.lover
  puts "kitty"
end
user.singleton_methods #=> [:lover]

other_user = User.new
other_user.singleton_methods #=> []

class Admin < User
end
Admin.singleton_methods #=> [:name, :age]

以上就是關(guān)于“Singleton Class的對象模型設(shè)計有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI