亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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ù)被重載的特征:
(1)相同的范圍(在同一個類中);
(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á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.      requireload

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)文章

最新評論