Ruby元程式設計 讀書筆記 第1章

2021-10-17 21:35:46 字數 2972 閱讀 8178

元程式設計是編寫能寫**的**

語言構件(language construct)包含各種成員(變數、類、方法等)。

以c++為例,一旦編譯器完成了工作,變數和函式這樣的東西就變得看不見摸不著了,它們只存在於記憶體中。你沒有辦法向乙個類詢問它的例項方法,因為當你問出這個問題時,它可能已經消失了。對於c++這樣的語言來說,執行時(runtime)是乙個可怕的寂靜之地----鬼城。

而在另外一些語言(如ruby)中,執行時更像是乙個繁忙的自由市場。大多數語言構件依然存在,而且正四處忙碌著。你甚至可以抓住乙個構件,詢問它關於它自身的問題。這種方式稱作內省(introspection)

讓我們通過乙個例項來看看內省究竟是什麼。

class

greeting

definitialize

(text)

@text

= text

enddef welcome

@text

endend

my_object = greeting.new("hello")這裡定義了乙個greeting類,並建立了乙個greeting物件。現在我們可以抓住這個物件,並像它提問:

my_object.class #=> greeting

我問它所屬的類,它十分肯定的回答我:「我是乙個greeting」,現在我要問它有哪些例項方法:

my_object.class.instance_methods(false) #=> [:welcome]

我得到的回答是乙個陣列,其中只有乙個方法welcome。引數false代表我是問它自己的方法,不要它繼承來的方法。接著,我問它有哪些例項變數:

my_object.instance_variables #=> [:@text]

它如實回答了我的問題。類和物件都是ruby世界的一等公民,你可以問出很多資訊來。

ruby除了可以在執行時詢問語言構件,還能在執行時建立它們。在程式執行時,能否在welcome方法之外再新增乙個例項方法?你可能不太理解,究竟什麼情況下會有這樣的需求呢?請看下面的故事。

bob有乙個計畫:為電影迷建造乙個世界最大的網際網路社交系統。為了實現這個目標,他先要建立乙個存放電影名和影評的資料庫。bob希望藉此機會練習編寫可重用的**,因此他決定建立乙個簡單的**庫,用於在資料庫中實現物件的持久化。

1.2.1 bob的第一次嘗試

bob編寫了乙個**庫,把資料庫中的每個表對映到乙個類中,同時把每條記錄對映到乙個物件中。每當創乙個物件或訪問它的屬性時,這個物件會產生一條sql語句並傳送給資料庫。所有這些功能都封裝在乙個類中。

class

entity

attr_reader :table

,:ident

definitialize

(table, ident)

@table

= table

@ident

= ident

database

.sql "insert into #

(id) values (#

)"end

defset

(col, val)

database

.sql "update #

set #

='#' where id=#

"end

defget

(col)

database

.sql (

"select #

from #

where id=#")

[0][

0]endend

在bob的資料庫中,每個表都有乙個id欄位。每個entity會儲存這個欄位的內容以及它引用的表名。每建立乙個entity物件後,該物件會把自己儲存在資料庫裡。entity#set方法建立sql語句更新字段值,而entity#get方法建立sql語句讀取字段值。(bob的database類用二維陣列作為返回的資料集)

bob可以繼承entity類來對映乙個指定的表。例如,用movie類對映乙個名為movies的表:

class

movie

<

entity

definitialize

(ident)

super

"movies"

, ident

enddef title

get "title"

enddef title=

(value)

set "title"

, value

enddef director

get "director"

enddef director=

(value)

set "director"

, value

endend

movie類的每個屬性有兩個方法:乙個讀方法和乙個寫方法。bob只要在ruby命令列直譯器中輸入如下命令,就能把一部電影載入到資料庫裡:

movie =

movie

.new(1

)movie.title =

"doctor strangelove"

movie.director =

"stanley kubrick"

bill看了bob的**後說:「重複的**太多了。資料庫裡有title欄位,**裡有@title成員,還有title方法、title=方法、title字串常量。如果你會元程式設計,用很少的**就可以解決這個問題。」

1.2.2 進入元程式設計的世界

未完待續

讀書筆記 Ruby 元程式設計4

單件方法 例子c class.new array c.send define method,my method do hello endmyclass c puts c.name obj myclass.new puts obj.my method 給obj物件定義單件方法,而這個方法只屬於obj自...

Windows核心程式設計 第1章讀書筆記

第一章.錯誤處理 1.dword getlasterror 2.為每個錯誤 分配乙個32位編號 3.函式呼叫失敗之後,應該馬上呼叫,避免返回值被修改 4.在vc vs中,可以在watch視窗新增 err,hr 一行來實時現實錯誤。除錯過程中,該項相當於在每次呼叫api函式之後呼叫getlasterr...

第1 2 16章讀書筆記

第一章 概論 原文 乙個好的軟體,即使功能和同類軟體區別不大,但卻會讓人感覺到非常好用。這就是軟體的使用者體驗。使用者體驗和資料結構,演算法沒有直接的關係,但是很多非常成功的軟體就贏在這個方面。軟體還要處理 不同語言,不同地區的使用者對介面和功能的不同需求,這個叫做軟體的國際化和本地化。1.使用者體...