我正在研究ruby對象模型並且有一些問題。我理解一個對象只存儲實例變量的想法,並且方法存儲在類中,對象有一個引用。我也明白的「自我」的理念 - 它是什麼,它如何改變等紅寶石對象模型的好解釋 - 主要是'類是對象'?
不過,我不明白的是概念,即「類的對象。」有沒有一個很好的,直觀的解釋?
(BTW:我使用Ruby Object Model and Metaprogramming和Metaprogramming Ruby爲我的兩個資源,如果有人可以建議別的東西,那將是有益的。)
感謝。
我正在研究ruby對象模型並且有一些問題。我理解一個對象只存儲實例變量的想法,並且方法存儲在類中,對象有一個引用。我也明白的「自我」的理念 - 它是什麼,它如何改變等紅寶石對象模型的好解釋 - 主要是'類是對象'?
不過,我不明白的是概念,即「類的對象。」有沒有一個很好的,直觀的解釋?
(BTW:我使用Ruby Object Model and Metaprogramming和Metaprogramming Ruby爲我的兩個資源,如果有人可以建議別的東西,那將是有益的。)
感謝。
這是我的一槍。
在Ruby中,類是對象。通常他們有Class
。例如,讓我們考慮類Foo
。
class Foo
end
毫無疑問,你以前見過這個,而且它並不令人興奮。但是,我們也可以這樣來定義Foo
這樣:
Foo = Class.new
就像你調用Foo.new
創建一個新的Foo
,您可以通過調用Class.new
創建一個新的Class
。然後,通過分配它,就像給其他變量一樣給這個類名稱Foo
。這裏的所有都是它的。
「類是對象」的概念(據我所知)意味着任何你可以用一個對象做的事情,你可以用一個類來完成。
這不同於類和類定義是從對象的不同,往往不能接近到運行時特別的文物其他編程語言。
例如在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
>>
這是不可能的在哪裏對象和類之間的區別是由其他編程語言。
注:也許你應該瞭解的基本概念紅寶石睡前元編程,因爲它可能會產生混淆,那我會做什麼。
值得注意的是,許多其他語言都具有此功能(值得注意的是,Smalltalk;許多其他語言從那裏借用)。 – 2010-03-03 20:26:54
其實Ruby從Smalltalk那裏拿了這個 – OscarRyz 2010-03-03 21:45:33
它意味着它聽起來像 - 類是對象。具體而言,它們是類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
我喜歡Stallman的笑話。 :) – 2010-03-03 20:11:49
當你想起來了,這是完全合乎邏輯的new
是一個函數,對不對?一個創建並返回一個新對象的函數。 (與大多數new
是某種操作符或語言構造的其他語言不同)
推進它,對於此函數更加合乎邏輯new
是它應該是一種方法,如果我們談論的是OO語言。誰的方法?一個對象的方法,只是一種不同類型的對象,我們可以稱之爲「class」。
所以,從這個角度來看,類只是特殊類型的對象,除了其他特性外,還有方法new
,並知道如何根據自己的圖像創建其他對象。
看一下這篇文章,你會發現它有幫助:
The Ruby Object Model - Structure and Semantics
我個人閱讀有關Smalltalk的一個(例如在Squeak文檔中)學到了很多關於Ruby的對象模型。取決於你在C方面的流利程度,MRI資源非常平易近人,並且能夠得出最明確的答案。
經過一段時間的Ruby之後,我來到了一個完全相反的問題:我們如何購買語言,其中的類不是對象... – 2010-03-03 19:48:08
嘗試通過David Black - 「基礎良好的Rubyist」 - http:// www .manning.com/black2/ – 2010-03-03 20:05:02