欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Terry七月Ruby讀書筆記(比較詳細(xì))第2/4頁(yè)

 更新時(shí)間:2008年11月18日 00:18:08   作者:  
今年7月讀《Ruby語(yǔ)言入門教程v1.0》時(shí)的讀書筆記,靜靜地面對(duì)電腦,嘗試一種新的語(yǔ)言,是一種淡然的快樂。

Page 40

面向?qū)ο?/B>

2008/7/13

 

1.    消息機(jī)制:對(duì)象通過消息影響對(duì)象,對(duì)象即類的實(shí)例。誰(shuí),將被影響?

2.    Object:東西,物體,客體。

3.    Class:種類,等級(jí),階級(jí);

4     動(dòng)態(tài)語(yǔ)言:人們可以決定代碼世界中一類事物的屬性、方法,當(dāng)然可以修改代碼世界中一類事物的屬性、方法,而且可以委托其它的類來修改,甚至刪除。這是動(dòng)態(tài)語(yǔ)言超越靜態(tài)語(yǔ)言之處。由于代碼是一直運(yùn)行著,與其它代碼一直交互著,修改、刪除應(yīng)該慎重,避免產(chǎn)生副作用。

5     封裝

注意:

類名首字母要大寫;

實(shí)例變量用@開頭;

方法名或者參數(shù)名用小寫字母或者下劃線開頭。

6 initialize是初始化方法

p2.motherland="ABC"    #以賦值,因?yàn)橛袑?duì)應(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 子類<父類

子類繼承父類:

重寫方法;

添加方法;

增強(qiáng)父類方法(super)。

Ruby語(yǔ)言已經(jīng)定義了一個(gè)類Object,如果你在定義新類的時(shí)候,沒有指明新類的父類,那么,Ruby解釋器認(rèn)為,新類的父類是 Object 類。類Object 含有new方法、initialize 方法…只要你不重寫這些方法,你就自然在使用類Object 的方法。

你寫一個(gè)類的時(shí)候,是在創(chuàng)造一類事物的藍(lán)圖;當(dāng)你new的時(shí)候,一個(gè)實(shí)例就按照藍(lán)圖生成了。

Ruby沒有析構(gòu)函數(shù),使用垃圾收集器自動(dòng)回收實(shí)例占用的資源。

8.多態(tài)

父類子類的行為差異,不同子類的行為差異,就是多態(tài)

Ruby語(yǔ)言,只有重寫(override),沒有其它語(yǔ)言具有的嚴(yán)格意義上的重載(overload)。Ruby語(yǔ)言有自己的單例方法,還有模塊插入(Mix-in)。

 

插曲

http://liubin.itpub.net/post/325/15623

覆蓋 override:

Overriding 也許叫做overwriting更合適,

OVERLOAD覆蓋是指在子類(c++中的派生類) 中重新定義父類的函數(shù),其函數(shù)名、參數(shù)列、返回值類型必須同父類中的相對(duì)應(yīng)被覆蓋的函數(shù)嚴(yán)格一致,覆蓋函數(shù)和被覆蓋函數(shù)只有函數(shù)體(花括號(hào)中的部分)不同,當(dāng)派生類對(duì)象調(diào)用子類中該同名函數(shù)時(shí)會(huì)自動(dòng)調(diào)用子類中的覆蓋版本,而不是父類中的被覆蓋函數(shù)版本。

 

重載(overload):

在同一個(gè)類中,出現(xiàn)多個(gè)同名的方法的現(xiàn)象就是Overload重載事發(fā)生在同一個(gè)類中,不同方法之間的現(xiàn)象。

 

在c++或者java中,方法一般為

返回類型 方法名(參數(shù)1,參數(shù)2)

判斷2個(gè)方法是不是overload,主要指方法名一樣,參數(shù)不一樣,參數(shù)不一樣指的是參數(shù)的個(gè)數(shù),相同位置的參數(shù)的類型是否一樣,而與參數(shù)(型參)的名稱無關(guān)(參數(shù)類型/個(gè)數(shù)/順序,不同),與返回類型也無關(guān)。程序會(huì)根據(jù)不同的參數(shù)列來確定需要調(diào)用的函數(shù)比如c++或者java中,這都是overload ruby中,不存在這樣的overload

 

多態(tài)(polymorphism)

至于多態(tài),我還沒有見過一個(gè)看一眼就能明白的定義。

有的說是允許將子類類型的指針賦值給父類類型的指針,當(dāng)然java中沒有指針的概念。

多態(tài)有時(shí)候也被稱為動(dòng)態(tài)綁定或者晚綁定或運(yùn)行時(shí)綁定,意思是編譯的時(shí)候不必關(guān)心,運(yùn)行的時(shí)候才決定調(diào)用哪個(gè)對(duì)象的哪個(gè)方法。

我覺得多態(tài)的用途之一就是在父類提供一個(gè)接口(服務(wù)),然后調(diào)用的時(shí)候用的卻是子類的具體實(shí)現(xiàn)。


 

page 49

Ruby前前后后

1.動(dòng)態(tài)語(yǔ)言

編程語(yǔ)言將向動(dòng)態(tài)回歸;

命令式語(yǔ)言和函數(shù)式語(yǔ)言將融合。

Ruby在語(yǔ)法層次實(shí)現(xiàn)了冗余。

Ruby語(yǔ)言的冗余性、缺陷性和動(dòng)態(tài)性正是現(xiàn)實(shí)世界的真實(shí)寫照。

 

page51

2.動(dòng)態(tài)變量類型

命令式語(yǔ)言

將操作數(shù)演化成現(xiàn)在我們熟悉的變量,將操作碼演化成方法(或叫函數(shù)),對(duì)變量執(zhí)行各種操作。

面向?qū)ο缶幊逃謱⒒咀兞亢头椒ǚ庋b在一起,成為一個(gè)更復(fù)雜的變量——對(duì)象。但是,在一個(gè)類中仍然區(qū)分基本變量和方法。

函數(shù)式語(yǔ)言

一開始的函數(shù)式語(yǔ)言不區(qū)分變量和方法,一切都是表(list),表就是能夠不斷分解成單個(gè)元素的數(shù)學(xué)符號(hào)。表可以是變量,可以是方法。

后來的有些函數(shù)式語(yǔ)言,吸取了命令式語(yǔ)言的語(yǔ)法,也區(qū)分變量和方法。

 

Ruby: 命令式語(yǔ)言,融合了函數(shù)式語(yǔ)言的語(yǔ)法,變量和方法區(qū)分得不很明顯。

變量名,變量值,變量類型,變量的作用域;“變量名,變量值”,必要的。

動(dòng)態(tài)類型語(yǔ)言:由編譯內(nèi)核(或解釋內(nèi)核)在運(yùn)行時(shí)刻來判斷變量類型的語(yǔ)言。
弱類型語(yǔ)言:弱化了類型的概念,變量在運(yùn)行中能夠隨時(shí)代表不同的事物,而不管事物是什么類型。

Ruby語(yǔ)言有基本類型。

純粹的函數(shù)式語(yǔ)言中沒有變量作用域的概念。

Ruby中有變量作用域概念,如變量名前綴字符。

實(shí)際應(yīng)用中,有時(shí)會(huì)比較復(fù)雜,在使用閉包時(shí)會(huì)顯現(xiàn)出來。

Ruby語(yǔ)言中,一切都是對(duì)象,變量不是對(duì)象,變量只是引用某個(gè)對(duì)象的時(shí)候的一個(gè)代號(hào)。

Ruby是動(dòng)態(tài)類型語(yǔ)言,不用給任何變量指定數(shù)據(jù)類型,解釋器會(huì)在你第一次賦值給變量時(shí),在內(nèi)部將數(shù)據(jù)類型記錄下來。

Ruby語(yǔ)言中,一個(gè)變量被賦予了某個(gè)數(shù)據(jù)類型的值,在程序中你可以隨時(shí)再賦予這個(gè)變量其它數(shù)據(jù)類型的值。

Ruby  是在運(yùn)行中檢測(cè)語(yǔ)法,只要與語(yǔ)法定義不矛盾,就能通過。

Ruby  的動(dòng)態(tài)類型特點(diǎn)是一把雙刃劍,

死盯住變量的命名。用一些有意義的名字,不必太長(zhǎng),但是應(yīng)該少用單字符,除非是循環(huán)指針變量。在一個(gè)項(xiàng)目組中,程序員是要彼此相互溝通合作的。

3.改變藍(lán)圖——類

Ruby是動(dòng)態(tài)語(yǔ)言,你可以改變Ruby程序的結(jié)構(gòu),功能。

在Ruby程序運(yùn)行中,方法、屬性可以被加入或去除,新的類或?qū)ο罂梢员唤?,新的模塊可以出現(xiàn)。

除了修改方法,添加方法,還可以除去方法。

Ruby是動(dòng)態(tài)語(yǔ)言:靈活,強(qiáng)大,初學(xué)者容易犯錯(cuò)誤;

 

4.編碼建議

(1)   命名

常量

大寫,下劃線分隔

MAX

類名/模塊名

大寫字母開頭

MyClass

方法名

小寫,下劃線分隔

is_prime?

變量/參數(shù)名

小寫字母開頭單詞組合

currentValue

注意:

類名、模塊名、變量名、參數(shù)名最好使用“名詞”或者“形容詞+名詞”。

方法名最好使用“動(dòng)詞”或者“動(dòng)詞+名詞”。例如:aStudent.talk。

在Ruby里,有時(shí)將“!”和“?”附于某些方法名后面。驚嘆號(hào)“!”暗示這個(gè)方法具有破壞性,有可能會(huì)改變傳入的參數(shù)。問號(hào)“?”表示這個(gè)方法是一個(gè)布爾方法,只會(huì)返回true或false。

 

(2)   空格

關(guān)鍵字之后要留空格。

逗號(hào)“,”、分號(hào)“;”之后要留空格。

“,”、“;”向前緊跟,緊跟處不留空格。

賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”等二元操作符的前后應(yīng)當(dāng)加空格。

 

一元操作符如“!”、“~”等之后不加空格。

象“[]”、“.”、“::”這類操作符前后不加空格。

函數(shù)名之后不要留空格,緊跟左圓括號(hào)“(”,以與關(guān)鍵字區(qū)別。左圓括號(hào)“(”向后緊跟,右圓括號(hào)“)”向前緊跟,緊跟處不留空格。

 

(3)   圓括號(hào)

Ruby中圓括號(hào)常常被省略

優(yōu)先規(guī)則會(huì)自動(dòng)確定哪個(gè)參數(shù)被哪個(gè)方法使用。

建議除了極簡(jiǎn)單的情況,還是使用圓括號(hào)為好。

圓括號(hào)還可以把幾個(gè)語(yǔ)句約束成一個(gè)語(yǔ)句集合。

 

(4)   return

在定義方法的時(shí)候,在最后一行可以顯式地return某個(gè)值或幾個(gè)值,但不是必須的。

Ruby方法的最后一行語(yǔ)句如果是表達(dá)式,表達(dá)式的值會(huì)被自動(dòng)返回;最后一行語(yǔ)句如果不是表達(dá)式,就什么也不返回。

return不僅僅用在方法的最后一行。使用break能夠跳出本層循環(huán),如果要從多重循環(huán)體中跳出,可以使用return,結(jié)束這個(gè)方法;return還能夠從方法的某個(gè)執(zhí)行點(diǎn)立即退出,而不理會(huì)方法的其余代碼。

 

(5)   注釋

注釋表明了一段代碼塊的功能、意圖或是代碼塊的解釋,應(yīng)該簡(jiǎn)潔明了,錯(cuò)誤的注釋不如沒有注釋。一般地,注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不要放在代碼的下方。


 

page 61

面向?qū)ο?/B>

1.      重載&重寫

多態(tài)性:重寫/覆蓋/覆寫(override) 重載(overload)

重載(overload)

重寫(override)

一個(gè)類中,方法名相同、參數(shù)列表不同的幾個(gè)方法,調(diào)用時(shí)根據(jù)不同的參數(shù)調(diào)用不同的方法。方法重載與返回類型無關(guān)。

子類有一個(gè)方法,方法名、參數(shù)列表、返回類型與父類的某個(gè)方法完全一致。調(diào)用時(shí)會(huì)調(diào)用子類的方法,而屏蔽掉父類的同名方法。需要注意的是,子類覆寫的方法,其可訪問性一定要強(qiáng)于或等同于,父類被覆寫的同名方法。

重載不僅僅是發(fā)生在子類和父類之間,大多數(shù)時(shí)候,發(fā)生在同一個(gè)類中。

覆寫發(fā)生在子類和父類之間,當(dāng)然也可以是子類和父類的父類之間。

成員函數(shù)被重載的特征:
(1)相同的范圍(在同一個(gè)類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關(guān)鍵字可有可無。
覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual關(guān)鍵字。

 

URL:http://blog.csdn.net/zgbsoap/archive/2005/12/30/566120.aspx

Ruby語(yǔ)言,只有重寫,沒有其它語(yǔ)言具有的嚴(yán)格意義上的重載。

分析:重載,參數(shù)不同,參數(shù)列表對(duì)應(yīng)位置參數(shù)類型不同。而ruby支持缺省參數(shù)、可變參數(shù),因此,參數(shù)不同不會(huì)發(fā)生重載。所以,ruby沒有嚴(yán)格意義上的重載。

父類和子類中的同名方法,子類重寫父類。子類對(duì)象執(zhí)行子類中的方法。

在同一個(gè)類中寫兩個(gè)同名方法,總是執(zhí)行寫在后面的方法。

ruby支持缺省參數(shù),和C++相同。

在 Ruby中,我們說覆寫是指重寫,我們說重載也是指重寫。

Ruby是動(dòng)態(tài)語(yǔ)言,可以隨時(shí)改變類的屬性、方法,所以覆寫和重載的重要性就降低了。

2.      增強(qiáng)父類方法

如果我們只是想增強(qiáng)父類的方法,而不是完全地替代它,就可以用關(guān)鍵字super指明。

在子類定義和父類同名的函數(shù)時(shí),加入super關(guān)鍵字。

3.      變量

(1)      穩(wěn)定性

constant :Unchanging in nature, value, or extent; invariable.穩(wěn)定的,不變的。

常變量(常量)。常量名用大寫字母開頭。

變量:作用域,可以改變值。

Ruby中的常量,可以在類和模塊中定義,不能在方法中定義。

如果在外部訪問類或模塊中的常量,要使用域作用符::。

(2)      作用域

全局變量——作用域程序任何位置,全局變量用$開頭。

局部變量——作用域程序某個(gè)單元,用小寫字母開頭。

全局變量和實(shí)例變量如果沒有初始化,其默認(rèn)值為 nil 。

Ruby中的局部變量,可以是存在于類、方法、模塊、循環(huán)、過程對(duì)象中。

(3)      共享性

實(shí)例變量——只能被某個(gè)實(shí)例對(duì)象使用的變量,變量名用@開頭;

類變量——能被某個(gè)類的所有實(shí)例對(duì)象共享的變量,變量名用@@開頭

類變量在使用前必須要初始化。

(4)      類方法

類方法——不依賴于任何特定實(shí)例對(duì)象的方法。

類方法與實(shí)例方法的定義方式不同,定義類方法要在方法名前加上類名和點(diǎn)號(hào)“.

調(diào)用一個(gè)類方法,與定義類方法一樣,要在方法名前加上類名和點(diǎn)號(hào)“.”。

類方法提供了一個(gè)途徑,在類的外部訪問類變量,無需通過類的實(shí)例方法。

對(duì)象是類的實(shí)例,說明類是對(duì)于對(duì)象的一個(gè)抽象,那么,如果把類繼續(xù)抽象,把類看做實(shí)例,那它會(huì)是誰(shuí)的實(shí)例?

——元類!

元數(shù)據(jù),描述數(shù)據(jù)的數(shù)據(jù)。

疑問:類方法可否操作實(shí)例變量,而不僅僅是類變量?

 

4.      單例方法

Ruby如何反映相同的類,不同實(shí)例,之間的不同的行為特征?

(1)單例方法:在Ruby里,可以給具體的實(shí)例對(duì)象添加實(shí)例方法,這個(gè)方法只屬于這個(gè)實(shí)例對(duì)象,我們把這樣的方法稱之為單例方法,單例方法也叫作單件方法。

2)定義單例方法

首先要生成一個(gè)實(shí)例對(duì)象,

其次,要在方法名前加上對(duì)象名和一個(gè)點(diǎn)號(hào)“.”。

(3)實(shí)例方法,屬于類的每個(gè)實(shí)例對(duì)象。單例方法只出現(xiàn)在單個(gè)實(shí)例對(duì)象中。用單例方法可以極大地豐富多態(tài)性在Ruby中的表現(xiàn)力。

Ruby對(duì)于類和對(duì)象的擴(kuò)展,就像數(shù)學(xué)中的多維,原來只是類和對(duì)象兩個(gè)層次,這里,看成任意的層次,只不過,類和對(duì)象是其中的兩個(gè)不同的層次。所以,有了類的類——類的進(jìn)一步抽象,有了單例方法,在對(duì)象這個(gè)層面上設(shè)計(jì)方法。

 

5.      訪問控制

在Ruby里,要讀取或是改變對(duì)象的屬性,唯一的途徑是調(diào)用對(duì)象的方法。

控制了對(duì)方法的訪問,也就控制了對(duì)對(duì)象屬性的訪問。

控制對(duì)方法的訪問,有三種方式:

訪問控制

意義

public

可以被任何實(shí)例對(duì)象調(diào)用,不存在訪問控制;

protected

可以被定義它的類和其子類訪問,

可以在類中或子類中指定給實(shí)例對(duì)象;

private

可以被定義它的類和其子類訪問,

不能被實(shí)例對(duì)象調(diào)用。

方法默認(rèn)都是公有的(initialize方法除外,它永遠(yuǎn)是私有的)。

它的類和其子類訪問,

私有方法不能指定對(duì)象。

public方法

可以被定義它的類和其子類訪問,

可以被類和子類的實(shí)例對(duì)象調(diào)用;

protected方法

可以被定義它的類和其子類訪問,

不能被類和子類的實(shí)例對(duì)象直接調(diào)用,

但是可以在類和子類中指定給實(shí)例對(duì)象;

private方法

可以被定義它的類和其子類訪問,

私有方法不能指定對(duì)象。

Ruby語(yǔ)言的訪問控制是動(dòng)態(tài)的,是在程序運(yùn)行時(shí)刻確立的。

你可以根據(jù)自己的需要,在程序的不同位置,改變某個(gè)方法的訪問控制級(jí)別,讓你的程序更加富于變化。

page 79

模塊化程序設(shè)計(jì)

1.      模塊

在程序中,相關(guān)的、不相關(guān)的代碼的組合,叫作模塊。一般情況下,我們總是把功能相關(guān)的代碼放在一個(gè)模塊里。

把功能相關(guān)的程序代碼放在一個(gè)模塊里,體現(xiàn)了模塊的第一個(gè)作用:可以被其它程序代碼重復(fù)使用。

Ruby標(biāo)準(zhǔn)包里的 Math 模塊提供了許多方法

模塊名.方法名(參數(shù))

 

Math  模塊還提供了兩個(gè)常量,圓周率π  和自然對(duì)數(shù)底 e,

模塊名::常量名

 

定義模塊用 module...end 。模塊與類非常相似,但是:

 A)  模塊不可以有實(shí)例對(duì)象;

 B)  模塊不可以有子類。

 

2.      命名空間

模塊的第二個(gè)作用:提供了一個(gè)命名空間(namespace),防止命名沖突。

include 模塊名

定義一個(gè)模塊方法,在方法名前加上模塊名和一個(gè)點(diǎn)號(hào)“.”。

調(diào)用一個(gè)模塊方法,與定義模塊方法一樣,要在方法名前加上模塊名和一個(gè)點(diǎn)號(hào)“.”。模塊方法提供了一個(gè)途徑,在模塊的外部訪問模塊內(nèi)部方法,無須 include模塊。定義模塊常量不需要如此。

 

3.      糅和(Mix-in)與多重繼承

柔和/混合插入/Mix-in

Ruby是單繼承,通過Mix-in模塊,實(shí)現(xiàn)多重繼承的優(yōu)點(diǎn)。

模塊的第三個(gè)作用:實(shí)現(xiàn)了類似多重繼承的功能。

通過“<父類名”,一個(gè)子類可以得到父類的屬性和方法;

通過“include模塊名”,一個(gè)子類可以得到某個(gè)模塊的常量和方法。

類不能被include。

include方法為一個(gè)類的所有對(duì)象包含某個(gè)模塊;

extend方法為一個(gè)類的某個(gè)對(duì)象包含某個(gè)模塊(聯(lián)系單例方法)。

 

4.      requireload

require方法包含另一個(gè)文件,另一個(gè)文件名需要是一個(gè)字符串。

load方法與require方法相對(duì)應(yīng),也用來包含另一個(gè)文件。

require包含文件,只加載一次,遇到同一文件時(shí)自動(dòng)忽略;不同路徑下的同名文件會(huì)多次加載。

load包含文件,加載多次,即使是相同路徑下同一文件。

 

總結(jié)一下:

require,load

包含文件

include,extend

包含模塊

 

require

加載文件一次

加載文件時(shí)可以不加后綴名

一般情況下用于加載庫(kù)文件

load

加載文件多次

加載文件時(shí)必須加后綴名

用于加載配置文件

 

利用load多次加載文件的特性,可以用來實(shí)現(xiàn)程序的無縫升級(jí)和系統(tǒng)的熱部署。程序功能改變了,你只需要重新load一次,其它代碼與它再次交互的時(shí)候,這個(gè)程序?qū)嶋H上已經(jīng)不是原來的程序了。

page 88

相關(guān)文章

最新評(píng)論