[Day10] 梅利號陪伴著草帽海賊團走過了許多的風風雨雨。。。
鐵人終於來到了第十天了,還記得當初出航的勇氣嗎?
今天想和大家討論一個非常重要的主題,在程式領域的範疇裡,我們無法避開它,那就是物件(object)。
按照慣例,先說一下程式語言裡的物件是什麼?
在剛接觸 Ruby 時,常常會聽到或看到一句話:「在 Ruby 裡,幾乎所有東西都是物件。」讓我相當好奇,究竟程式語言裡的物件是什麼?
在開始之前,我們先定義一個 Cat
類別:
class Cat
attr_reader :age
def initialize(age)
@age = age
puts "meows~"
end
def walk
puts "走了一小段...爆衝!"
end
def eat
puts "只有肉泥我才要!"
end
end
(不知道什麼是類別也別緊張!明天就會介紹 類別 了~)
接著,我們來創造一隻屬於 Cat
類別的物件 didi
:
didi = Cat.new
meows~
didi
一出生就很有精神地喵喵叫了呢!
試想一下,你我都是 Ruby 程式世界的造物主,就在剛剛,我們已經創造了一個 didi
的物件。 didi
目前在 Ruby 的世界裡已經適應地很好,也領到了自己的身分證:
didi
=> #<Cat:0x00007fa5dd155920 @age=0>
didi.object_id
=> 180 # ID_card get!
可以先把物件想作是一段活生生的程式碼,或者說是將記憶體的位置 擬物化
的過程。
物件可以像人、或是像任何一種生物一樣,
它會被賦予一個特定的意義,擁有自己的 狀態 和 行為,不過又和方法(method)的定義不太一樣。
其實這件事一開始並不是很好理解,我是從自身出發去思考這個脈絡的。
譬如說,每個人都會有屬於自己的髮色、年齡等等,這些就是狀態的一種,至於吃飯、睡覺、走路等等,則是人們常見的行為。所以如果把現實世界參照到程式的世界,我們「每一個人」其實就是活在其中的物件,而「人類」就是我們所屬的類別了。(關於類別和實體的關係,明天會有更詳細的介紹。)
現在,再回過頭來看我們剛剛創造的 didi
:
# didi 現在幾歲
didi.age
=> 0
# didi 走路
didi.walk
走了一小段...爆衝!
# didi 吃東西
didi.eat
只有肉泥我才要!
didi
也有了屬於它自己的狀態和行為了,是不是很可愛呢!
順帶一提,在了解程式世界與物件的關係後,
我不禁想起 Matrix 和虛擬理論,這邊帶個老高的影片給大家複習複習:
神也要花上六天才寫完程式啊...
在程式的世界裡,我們會對著物件呼叫方法,來完成我們打算讓它執行的事情。
這裡就不得不提**物件導向(Object Oriented)**了(老實說我本來沒預料到要寫這個)
要用文字講解這麼抽象的概念,我自己也有點亂,接下來我們還是一邊看程式碼一邊說明吧!
在剛剛的例子裡:
didi.eat
可以看到, 我們對 didi
這個物件使用一個方法叫做 eat
,在一開始理解時,我會說是在這個物件 didi
呼叫了 times
這個方法。
但是在知道更多物件導向的概念後,我開始轉換思考的方式,把這整件事看成是 didi
這個接收者,接受了我傳遞給它的 eat
訊息,在 Ruby 裡,某些特定物件可以理解某些特定訊息,並對應到可執行的方法。
所以,我們並不只是在 didi
這個物件上呼叫了 eat
這個方法這麼單純而已,物件導向其實還偷偷做了很多的事情,不過由於篇幅有限,時間也相當緊迫,在此篇無法完整概述。
相信在不久後的將來,我勢必會再重新說明一次 Object Oriented 的概念,就像學 JavaScript 的人都要寫一篇網誌來說明什麼是 closure
沒有兩樣。
覺得還要更多的篇幅才能講完物件的概念,不過剛剛寫到後來我看了一下時間,發現如果只剩 30 分鐘再不發文就要斷更啦!趕快緊急停筆,不好意思只能先寫到這邊~
另外,其實在寫今天這篇物件之前,我一直在考慮到底要先介紹 類別
還是 物件
較好,苦惱了很久,畢竟 Ruby 語言裡有太多東西都環環相扣啦!最後決定還是先把自己對 物件
的理解寫出來,也梳理一番自己學習上的思緒。
緊接著明天就會介紹 Ruby 裡的類別啦!謝謝大家的觀看!