2010-03-03 52 views
12

我正在研究ruby對象模型並且有一些問題。我理解一個對象只存儲實例變量的想法,並且方法存儲在類中,對象有一個引用。我也明白的「自我」的理念 - 它是什麼,它如何改變等紅寶石對象模型的好解釋 - 主要是'類是對象'?

不過,我不明白的是概念,即「類的對象。」有沒有一個很好的,直觀的解釋?

(BTW:我使用Ruby Object Model and MetaprogrammingMetaprogramming Ruby爲我的兩個資源,如果有人可以建議別的東西,那將是有益的。)

感謝。

+1

經過一段時間的Ruby之後,我來到了一個完全相反的問題:我們如何購買語言,其中的類不是對象... – 2010-03-03 19:48:08

+0

嘗試通過David Black - 「基礎良好的Rubyist」 - http:// www .manning.com/black2/ – 2010-03-03 20:05:02

回答

7

這是我的一槍。

在Ruby中,類是對象。通常他們有Class。例如,讓我們考慮類Foo

class Foo 
end 

毫無疑問,你以前見過這個,而且它並不令人興奮。但是,我們也可以這樣來定義Foo這樣:

Foo = Class.new 

就像你調用Foo.new創建一個新的Foo,您可以通過調用Class.new創建一個新的Class。然後,通過分配它,就像給其他變量一樣給這個類名稱Foo。這裏的所有都是它的。

5

「類是對象」的概念(據我所知)意味着任何你可以用一個對象做的事情,你可以用一個類來完成。

這不同於類和類定義是從對象的不同,往往不能接近到運行時特別的文物其他編程語言。

例如在Ruby中,你可以在運行時修改任何對象,因爲類也是對象,你可以修改類它的自我,並在運行時添加方法,刪除方法,或在運行時添加和刪除屬性。

例如:

$ irb 
>> x = Object.new 
=> #<Object:0x1011ce560> 
>> x.to_s 
=> "#<Object:0x1011ce560>" 
>> undef to_s 
=> nil 
>> x.to_s 
NoMethodError: undefined method `to_s' for #<Object:0x1011ce560> 
from (irb):4 
>> 

這是不可能的在哪裏對象和類之間的區別是由其他編程語言。

注:也許你應該瞭解的基本概念紅寶石睡前元編程,因爲它可能會產生混淆,那我會做什麼。

+3

值得注意的是,許多其他語言都具有此功能(值得注意的是,Smalltalk;許多其他語言從那裏借用)。 – 2010-03-03 20:26:54

+3

其實Ruby從Smalltalk那裏拿了這個 – OscarRyz 2010-03-03 21:45:33

10

它意味着它聽起來像 - 類是對象。具體而言,它們是類Class,這本身就是類Module,這又是Object一個子類,就像在Ruby的所有其他類的子類的實例。像Ruby的任何其他對象,一個類可以回覆短信,有它自己的實例變量等

作爲一個實際的例子,讓我們private

class Person 
    attr_accessor :name, :height 
    private 
    attr_accessor :weight 
end 

這給出了個人的公開方法來訪問這個人的名字和高度的情況下,但對於人的體重訪問器是私有的。 BUTBUTBUT - 不像大多數語言那樣是關鍵字,private是Module類的普通方法。如果我們想要,我們可以重新定義它爲特定的類層次結構做不同的事情。

class RichardStallman 
    def self.private(*args) 
    puts "NO! INFORMATION WAS MEANT TO BE FREE!" 
    end 
end 
+4

我喜歡Stallman的笑話。 :) – 2010-03-03 20:11:49

0

當你想起來了,這是完全合乎邏輯的new是一個函數,對不對?一個創建並返回一個新對象的函數。 (與大多數new是某種操作符或語言構造的其他語言不同)

推進它,對於此函數更加合乎邏輯new是它應該是一種方法,如果我們談論的是OO語言。誰的方法?一個對象的方法,只是一種不同類型的對象,我們可以稱之爲「class」。

所以,從這個角度來看,類只是特殊類型的對象,除了其他特性外,還有方法new,並知道如何根據自己的圖像創建其他對象。

1

看一下這篇文章,你會發現它有幫助:

The Ruby Object Model - Structure and Semantics

我個人閱讀有關Smalltalk的一個(例如在Squeak文檔中)學到了很多關於Ruby的對象模型。取決於你在C方面的流利程度,MRI資源非常平易近人,並且能夠得出最明確的答案。