淺析Ruby中的methods,private_methods和instance_methods

來源:互聯網
上載者:User

標籤:

首先,methods,private_methods是Object類的執行個體方法;instance_methods是Module類的執行個體方法。

我們先來看看這樣安排的原因:

我們知道一個Ruby對象所能調用的方法包含在其祖先鏈中(包含這個對象的單例類).這裡所說的Ruby對象可以分為2類,一類是普通對象,像"abc",2,obj=Object.new這種對象,它們所屬的類分別是String,Fixnum,Object,我們稱這種對象為普通對象;還有一類對象是類(類本身也是一種對象),像String,Class這種類,也是對象,它們所屬的類都是Class,我們稱這種對象為類對象。


普通對象的祖先鏈,以"abc"為例,為String-> Comparable->Object->Kernel-> BasicObject

類對象的祖先鏈,以String為例,為Class->Module->Object->Kernel-> BasicObject

我們可以看到普通對象是沒有instance_methods方法的,因為其祖先鏈上沒有Module類。所以對於一個普通對象,我們只能說它有方法或私用方法,而不能說它有執行個體方法,執行個體方法是對一個類來說的。

類對象的祖先鏈上有Module類,所以其有instance_methods,我們也可以說類有執行個體方法。


另外,一個普通對象的methods和其所屬類的instance_methods一般是相等的。"abc".methods == String.instance_methods 因為普通對象的方法就是其所屬類的執行個體方法。

這裡說一般,是因為如果在一個普通對象的單例類中定義了一個執行個體方法,那麼普通對象的methods就會比其所屬類的執行個體方法要多。舉例如下:

obj = String.new("abc")
obj.instance_eval {
  def method1
    "method1"
  end
}
p obj.methods == String.instance_methods //false


最後,methods方法返回的是對象的public,protected方法,所以還要有一個private_methods方法返回其private方法。



淺析Ruby中的methods,private_methods和instance_methods

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.