Terry七月Ruby讀書筆記(比較詳細)第2/4頁
Page 40
面向?qū)ο?/B>
2008/7/13
1. 消息機制:對象通過消息影響對象,對象即類的實例。誰,將被影響?
2. Object:東西,物體,客體。
3. Class:種類,等級,階級;
4 動態(tài)語言:人們可以決定代碼世界中一類事物的屬性、方法,當(dāng)然可以修改代碼世界中一類事物的屬性、方法,而且可以委托其它的類來修改,甚至刪除。這是動態(tài)語言超越靜態(tài)語言之處。由于代碼是一直運行著,與其它代碼一直交互著,修改、刪除應(yīng)該慎重,避免產(chǎn)生副作用。
5 封裝
注意:
類名首字母要大寫;
實例變量用@開頭;
方法名或者參數(shù)名用小寫字母或者下劃線開頭。
6 initialize是初始化方法
p2.motherland="ABC" #以賦值,因為有對應(yīng)的setter方法。
setter: |
getter: |
attr_writer:motherland相當(dāng)于 |
attr_reader:motherland相當(dāng)于 |
def motherland=(value) return @motherland=value end |
def motherland return @motherland end |
attr_accessor :motherland
相當(dāng)于 attr_reader:motherland; attr_writer :motherland
7.繼承
class 子類<父類
子類繼承父類:
重寫方法;
添加方法;
增強父類方法(super)。
Ruby語言已經(jīng)定義了一個類Object,如果你在定義新類的時候,沒有指明新類的父類,那么,Ruby解釋器認(rèn)為,新類的父類是 Object 類。類Object 含有new方法、initialize 方法…只要你不重寫這些方法,你就自然在使用類Object 的方法。
你寫一個類的時候,是在創(chuàng)造一類事物的藍圖;當(dāng)你new的時候,一個實例就按照藍圖生成了。
Ruby沒有析構(gòu)函數(shù),使用垃圾收集器自動回收實例占用的資源。
8.多態(tài)
父類子類的行為差異,不同子類的行為差異,就是多態(tài)
Ruby語言,只有重寫(override),沒有其它語言具有的嚴(yán)格意義上的重載(overload)。Ruby語言有自己的單例方法,還有模塊插入(Mix-in)。
插曲
http://liubin.itpub.net/post/325/15623
覆蓋 override:
Overriding 也許叫做overwriting更合適,
OVERLOAD覆蓋是指在子類(c++中的派生類) 中重新定義父類的函數(shù),其函數(shù)名、參數(shù)列、返回值類型必須同父類中的相對應(yīng)被覆蓋的函數(shù)嚴(yán)格一致,覆蓋函數(shù)和被覆蓋函數(shù)只有函數(shù)體(花括號中的部分)不同,當(dāng)派生類對象調(diào)用子類中該同名函數(shù)時會自動調(diào)用子類中的覆蓋版本,而不是父類中的被覆蓋函數(shù)版本。
重載(overload):
在同一個類中,出現(xiàn)多個同名的方法的現(xiàn)象就是Overload重載事發(fā)生在同一個類中,不同方法之間的現(xiàn)象。
在c++或者java中,方法一般為
返回類型 方法名(參數(shù)1,參數(shù)2)
判斷2個方法是不是overload,主要指方法名一樣,參數(shù)不一樣,參數(shù)不一樣指的是參數(shù)的個數(shù),相同位置的參數(shù)的類型是否一樣,而與參數(shù)(型參)的名稱無關(guān)(參數(shù)類型/個數(shù)/順序,不同),與返回類型也無關(guān)。程序會根據(jù)不同的參數(shù)列來確定需要調(diào)用的函數(shù)比如c++或者java中,這都是overload ruby中,不存在這樣的overload
多態(tài)(polymorphism)
至于多態(tài),我還沒有見過一個看一眼就能明白的定義。
有的說是允許將子類類型的指針賦值給父類類型的指針,當(dāng)然java中沒有指針的概念。
多態(tài)有時候也被稱為動態(tài)綁定或者晚綁定或運行時綁定,意思是編譯的時候不必關(guān)心,運行的時候才決定調(diào)用哪個對象的哪個方法。
我覺得多態(tài)的用途之一就是在父類提供一個接口(服務(wù)),然后調(diào)用的時候用的卻是子類的具體實現(xiàn)。
page 49
Ruby前前后后
1.動態(tài)語言
編程語言將向動態(tài)回歸;
命令式語言和函數(shù)式語言將融合。
Ruby在語法層次實現(xiàn)了冗余。
Ruby語言的冗余性、缺陷性和動態(tài)性正是現(xiàn)實世界的真實寫照。
page51
2.動態(tài)變量類型
命令式語言 |
將操作數(shù)演化成現(xiàn)在我們熟悉的變量,將操作碼演化成方法(或叫函數(shù)),對變量執(zhí)行各種操作。 |
面向?qū)ο缶幊逃謱⒒咀兞亢头椒ǚ庋b在一起,成為一個更復(fù)雜的變量——對象。但是,在一個類中仍然區(qū)分基本變量和方法。 | |
函數(shù)式語言 |
一開始的函數(shù)式語言不區(qū)分變量和方法,一切都是表(list),表就是能夠不斷分解成單個元素的數(shù)學(xué)符號。表可以是變量,可以是方法。 |
后來的有些函數(shù)式語言,吸取了命令式語言的語法,也區(qū)分變量和方法。 |
Ruby: 命令式語言,融合了函數(shù)式語言的語法,變量和方法區(qū)分得不很明顯。
變量名,變量值,變量類型,變量的作用域;“變量名,變量值”,必要的。
動態(tài)類型語言:由編譯內(nèi)核(或解釋內(nèi)核)在運行時刻來判斷變量類型的語言。
弱類型語言:弱化了類型的概念,變量在運行中能夠隨時代表不同的事物,而不管事物是什么類型。
Ruby語言有基本類型。
純粹的函數(shù)式語言中沒有變量作用域的概念。
Ruby中有變量作用域概念,如變量名前綴字符。
實際應(yīng)用中,有時會比較復(fù)雜,在使用閉包時會顯現(xiàn)出來。
Ruby語言中,一切都是對象,變量不是對象,變量只是引用某個對象的時候的一個代號。
Ruby是動態(tài)類型語言,不用給任何變量指定數(shù)據(jù)類型,解釋器會在你第一次賦值給變量時,在內(nèi)部將數(shù)據(jù)類型記錄下來。
Ruby語言中,一個變量被賦予了某個數(shù)據(jù)類型的值,在程序中你可以隨時再賦予這個變量其它數(shù)據(jù)類型的值。
Ruby 是在運行中檢測語法,只要與語法定義不矛盾,就能通過。
Ruby 的動態(tài)類型特點是一把雙刃劍,
死盯住變量的命名。用一些有意義的名字,不必太長,但是應(yīng)該少用單字符,除非是循環(huán)指針變量。在一個項目組中,程序員是要彼此相互溝通合作的。
3.改變藍圖——類
Ruby是動態(tài)語言,你可以改變Ruby程序的結(jié)構(gòu),功能。
在Ruby程序運行中,方法、屬性可以被加入或去除,新的類或?qū)ο罂梢员唤?,新的模塊可以出現(xiàn)。
除了修改方法,添加方法,還可以除去方法。
Ruby是動態(tài)語言:靈活,強大,初學(xué)者容易犯錯誤;
4.編碼建議
(1) 命名
常量 |
大寫,下劃線分隔 |
MAX |
類名/模塊名 |
大寫字母開頭 |
MyClass |
方法名 |
小寫,下劃線分隔 |
is_prime? |
變量/參數(shù)名 |
小寫字母開頭單詞組合 |
currentValue |
注意:
類名、模塊名、變量名、參數(shù)名最好使用“名詞”或者“形容詞+名詞”。
方法名最好使用“動詞”或者“動詞+名詞”。例如:aStudent.talk。
在Ruby里,有時將“!”和“?”附于某些方法名后面。驚嘆號“!”暗示這個方法具有破壞性,有可能會改變傳入的參數(shù)。問號“?”表示這個方法是一個布爾方法,只會返回true或false。
(2) 空格
關(guān)鍵字之后要留空格。
逗號“,”、分號“;”之后要留空格。
“,”、“;”向前緊跟,緊跟處不留空格。
賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”等二元操作符的前后應(yīng)當(dāng)加空格。
一元操作符如“!”、“~”等之后不加空格。
象“[]”、“.”、“::”這類操作符前后不加空格。
函數(shù)名之后不要留空格,緊跟左圓括號“(”,以與關(guān)鍵字區(qū)別。左圓括號“(”向后緊跟,右圓括號“)”向前緊跟,緊跟處不留空格。
(3) 圓括號
Ruby中圓括號常常被省略
優(yōu)先規(guī)則會自動確定哪個參數(shù)被哪個方法使用。
建議除了極簡單的情況,還是使用圓括號為好。
圓括號還可以把幾個語句約束成一個語句集合。
(4) return
在定義方法的時候,在最后一行可以顯式地return某個值或幾個值,但不是必須的。
Ruby方法的最后一行語句如果是表達式,表達式的值會被自動返回;最后一行語句如果不是表達式,就什么也不返回。
return不僅僅用在方法的最后一行。使用break能夠跳出本層循環(huán),如果要從多重循環(huán)體中跳出,可以使用return,結(jié)束這個方法;return還能夠從方法的某個執(zhí)行點立即退出,而不理會方法的其余代碼。
(5) 注釋
注釋表明了一段代碼塊的功能、意圖或是代碼塊的解釋,應(yīng)該簡潔明了,錯誤的注釋不如沒有注釋。一般地,注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不要放在代碼的下方。
page 61
面向?qū)ο?/B>
1. 重載&重寫
多態(tài)性:重寫/覆蓋/覆寫(override) 重載(overload)
重載(overload) |
重寫(override) |
一個類中,方法名相同、參數(shù)列表不同的幾個方法,調(diào)用時根據(jù)不同的參數(shù)調(diào)用不同的方法。方法重載與返回類型無關(guān)。 |
子類有一個方法,方法名、參數(shù)列表、返回類型與父類的某個方法完全一致。調(diào)用時會調(diào)用子類的方法,而屏蔽掉父類的同名方法。需要注意的是,子類覆寫的方法,其可訪問性一定要強于或等同于,父類被覆寫的同名方法。 |
重載不僅僅是發(fā)生在子類和父類之間,大多數(shù)時候,發(fā)生在同一個類中。 |
覆寫發(fā)生在子類和父類之間,當(dāng)然也可以是子類和父類的父類之間。 |
成員函數(shù)被重載的特征:
URL:http://blog.csdn.net/zgbsoap/archive/2005/12/30/566120.aspx |
Ruby語言,只有重寫,沒有其它語言具有的嚴(yán)格意義上的重載。
分析:重載,參數(shù)不同,參數(shù)列表對應(yīng)位置參數(shù)類型不同。而ruby支持缺省參數(shù)、可變參數(shù),因此,參數(shù)不同不會發(fā)生重載。所以,ruby沒有嚴(yán)格意義上的重載。
父類和子類中的同名方法,子類重寫父類。子類對象執(zhí)行子類中的方法。
在同一個類中寫兩個同名方法,總是執(zhí)行寫在后面的方法。
ruby支持缺省參數(shù),和C++相同。
在 Ruby中,我們說覆寫是指重寫,我們說重載也是指重寫。
Ruby是動態(tài)語言,可以隨時改變類的屬性、方法,所以覆寫和重載的重要性就降低了。
2. 增強父類方法
如果我們只是想增強父類的方法,而不是完全地替代它,就可以用關(guān)鍵字super指明。
在子類定義和父類同名的函數(shù)時,加入super關(guān)鍵字。
3. 變量
(1) 穩(wěn)定性
constant :Unchanging in nature, value, or extent; invariable.穩(wěn)定的,不變的。
常變量(常量)。常量名用大寫字母開頭。
變量:作用域,可以改變值。
Ruby中的常量,可以在類和模塊中定義,不能在方法中定義。
如果在外部訪問類或模塊中的常量,要使用域作用符::。
(2) 作用域
全局變量——作用域程序任何位置,全局變量用$開頭。
局部變量——作用域程序某個單元,用小寫字母開頭。
全局變量和實例變量如果沒有初始化,其默認(rèn)值為 nil 。
Ruby中的局部變量,可以是存在于類、方法、模塊、循環(huán)、過程對象中。
(3) 共享性
實例變量——只能被某個實例對象使用的變量,變量名用@開頭;
類變量——能被某個類的所有實例對象共享的變量,變量名用@@開頭。
類變量在使用前必須要初始化。
(4) 類方法
類方法——不依賴于任何特定實例對象的方法。
類方法與實例方法的定義方式不同,定義類方法要在方法名前加上類名和點號“.”。
調(diào)用一個類方法,與定義類方法一樣,要在方法名前加上類名和點號“.”。
類方法提供了一個途徑,在類的外部訪問類變量,無需通過類的實例方法。
對象是類的實例,說明類是對于對象的一個抽象,那么,如果把類繼續(xù)抽象,把類看做實例,那它會是誰的實例? ——元類! 元數(shù)據(jù),描述數(shù)據(jù)的數(shù)據(jù)。 |
疑問:類方法可否操作實例變量,而不僅僅是類變量?
4. 單例方法
Ruby如何反映相同的類,不同實例,之間的不同的行為特征?
(1)單例方法:在Ruby里,可以給具體的實例對象添加實例方法,這個方法只屬于這個實例對象,我們把這樣的方法稱之為單例方法,單例方法也叫作單件方法。
(2)定義單例方法:
首先要生成一個實例對象,
其次,要在方法名前加上對象名和一個點號“.”。
(3)實例方法,屬于類的每個實例對象。單例方法只出現(xiàn)在單個實例對象中。用單例方法可以極大地豐富多態(tài)性在Ruby中的表現(xiàn)力。
Ruby對于類和對象的擴展,就像數(shù)學(xué)中的多維,原來只是類和對象兩個層次,這里,看成任意的層次,只不過,類和對象是其中的兩個不同的層次。所以,有了類的類——類的進一步抽象,有了單例方法,在對象這個層面上設(shè)計方法。
5. 訪問控制
在Ruby里,要讀取或是改變對象的屬性,唯一的途徑是調(diào)用對象的方法。
控制了對方法的訪問,也就控制了對對象屬性的訪問。
控制對方法的訪問,有三種方式:
訪問控制 |
意義 |
public |
可以被任何實例對象調(diào)用,不存在訪問控制; |
protected |
可以被定義它的類和其子類訪問, 可以在類中或子類中指定給實例對象; |
private |
可以被定義它的類和其子類訪問, 不能被實例對象調(diào)用。 |
方法默認(rèn)都是公有的(initialize方法除外,它永遠是私有的)。
public方法 |
可以被定義它的類和其子類訪問, 可以被類和子類的實例對象調(diào)用; |
protected方法 |
可以被定義它的類和其子類訪問, 不能被類和子類的實例對象直接調(diào)用, 但是可以在類和子類中指定給實例對象; |
private方法 |
可以被定義它的類和其子類訪問, 私有方法不能指定對象。 | 它的類和其子類訪問,
Ruby語言的訪問控制是動態(tài)的,是在程序運行時刻確立的。
你可以根據(jù)自己的需要,在程序的不同位置,改變某個方法的訪問控制級別,讓你的程序更加富于變化。
page 79
模塊化程序設(shè)計
1. 模塊
在程序中,相關(guān)的、不相關(guān)的代碼的組合,叫作模塊。一般情況下,我們總是把功能相關(guān)的代碼放在一個模塊里。
把功能相關(guān)的程序代碼放在一個模塊里,體現(xiàn)了模塊的第一個作用:可以被其它程序代碼重復(fù)使用。
Ruby標(biāo)準(zhǔn)包里的 Math 模塊提供了許多方法
模塊名.方法名(參數(shù)) |
Math 模塊還提供了兩個常量,圓周率π 和自然對數(shù)底 e,
模塊名::常量名 |
定義模塊用 module...end 。模塊與類非常相似,但是:
A) 模塊不可以有實例對象;
B) 模塊不可以有子類。
2. 命名空間
模塊的第二個作用:提供了一個命名空間(namespace),防止命名沖突。
include 模塊名
定義一個模塊方法,在方法名前加上模塊名和一個點號“.”。
調(diào)用一個模塊方法,與定義模塊方法一樣,要在方法名前加上模塊名和一個點號“.”。模塊方法提供了一個途徑,在模塊的外部訪問模塊內(nèi)部方法,無須 include模塊。定義模塊常量不需要如此。
3. 糅和(Mix-in)與多重繼承
柔和/混合插入/Mix-in
Ruby是單繼承,通過Mix-in模塊,實現(xiàn)多重繼承的優(yōu)點。
模塊的第三個作用:實現(xiàn)了類似多重繼承的功能。
通過“<父類名”,一個子類可以得到父類的屬性和方法;
通過“include模塊名”,一個子類可以得到某個模塊的常量和方法。
類不能被include。
include方法為一個類的所有對象包含某個模塊;
extend方法為一個類的某個對象包含某個模塊(聯(lián)系單例方法)。
4. require和load
require方法包含另一個文件,另一個文件名需要是一個字符串。
load方法與require方法相對應(yīng),也用來包含另一個文件。
require包含文件,只加載一次,遇到同一文件時自動忽略;不同路徑下的同名文件會多次加載。
load包含文件,加載多次,即使是相同路徑下同一文件。
總結(jié)一下:
require,load |
包含文件 |
include,extend |
包含模塊 |
require |
加載文件一次 |
加載文件時可以不加后綴名 |
一般情況下用于加載庫文件 |
load |
加載文件多次 |
加載文件時必須加后綴名 |
用于加載配置文件 |
利用load多次加載文件的特性,可以用來實現(xiàn)程序的無縫升級和系統(tǒng)的熱部署。程序功能改變了,你只需要重新load一次,其它代碼與它再次交互的時候,這個程序?qū)嶋H上已經(jīng)不是原來的程序了。
page 88
相關(guān)文章
Ruby的面向?qū)ο蠓绞骄幊虒W(xué)習(xí)雜記
Ruby是具有面向?qū)ο筇匦缘木幊陶Z言,這里整理了一些Ruby的面向?qū)ο蠓绞骄幊虒W(xué)習(xí)雜記,包括類與方法等基本的面向?qū)ο笠氐闹R,需要的朋友可以參考下2016-05-05mac os gem安裝json出現(xiàn)error failed的解決辦法
這篇文章主要介紹了mac os gem安裝json出現(xiàn)error failed的解決辦法,系統(tǒng)是mac os Mavericks,失敗提示Failed to build gem native extension,需要的朋友可以參考下2014-06-06Ruby on rails安裝后去掉DL is deprecated,please use Fiddle警告信息的方法【
這篇文章主要介紹了Ruby on rails安裝后去掉DL is deprecated,please use Fiddle警告信息的方法,通過針對Ruby on rails安裝文件中的警告部分源碼進行注釋來達到消除警告的目的,需要的朋友可以參考下2017-02-02Ruby 中$開頭的全局變量、內(nèi)部變量、隱藏變量介紹
這篇文章主要介紹了Ruby 中$開頭的全局變量、內(nèi)部變量、隱藏變量介紹,需要的朋友可以參考下2014-04-04