| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • Stop wasting time looking for files and revisions. Connect your Gmail, DriveDropbox, and Slack accounts and in less than 2 minutes, Dokkio will automatically organize all your file attachments. Learn more and claim your free account.

View
 

Mud常量和變量類型

Page history last edited by PBworks 13 years, 6 months ago

  作者:darks  發表時間:2001年4月26日 09:16

 

--------------------------------------------------------------------------------

 

常量和變量類型

 

--------------------------------------------------------------------------------

 

 

 

LPC的全局常量,一般都是通過 globals.h 這個文件來完成。這個全局定義文件,將會是所定義的內容在整個Mudlib有效。通過定義 runtime_config.h,可以通過 get_config() 來獲得系統的一些基本屬性,這些屬性都是在config文檔中所預先定義的。

 

 

 

Lpc的變量類型不是很多,但是感覺足夠用。我們不討論一些比較偏門的聲明,比如status,char這種,大多數的MudOS編譯結果,都會淘汰這些。

 

 

int,string,array,object,mapping,function,float,buffer,class,void,mixed

 

 

int 是最實用的類型之一,在LPmud中,int足可以表示很多數學問題。32位系統中,int的範圍是 -2147483648 ~ +2147483648,所以一般房間繼承中的 int query_max_encumbrance() { return 100000000000; }

 

就是 int query_max_encumbrance() { return 2147483648; } 設計Lib的時候,要注意運算不要超過這個範圍,否則就是常說的溢出現象了,如果運算結果超過最大值,就會轉向相反的方向,負值為正,正值為負。賦值如果超過範圍,那麼系統自動會取的最大限。一個只有聲明沒有賦值的整數變量,可以被系統認為是0。因為整數的NULL和0接近。所以,你可以這樣做: int i; i++;

 

 

string 是Lpmud的主體定義之一,幾乎很多形態都是字符串,尤其是整個世界!頭尾加上一個引號,就變成了字符串。比如:string line = "this line"; 如果數值加上引號,也是字符串:"392032"。在字符串中,有一些常用的符號,比如 "\n" 表示一個換行,"\b" 表示一個tab符,這些和標準C沒有太大的區別。一個只有聲明沒有賦值的字符串變量,被系統認為是NULL。字符串變量不會和 0 有關。所以你一旦這樣做,就會出錯: string i; i += ""; 換個方式,這樣做,就可以避免這個錯誤:string i=""; i += ""; 雖然這段代碼毫無意義,但是空的字符串必須通過""來賦值,而不是簡單的通過聲明。

 

 

array 這個關鍵字的出現,其實我個人認為和MudOS編譯有關,最簡單的方式就是在變量聲明前加上 * ,這是一個方便的方式,當然,如果你覺得會和你的C習慣相衝突的話,那麼,使用 array 可以避免困惑。一個數組的定義必須附加上數組成員類型的說明,一般如下: int array x = ({}); 或者 int *x = ({}); 相信,國內大多數設計者更習慣看到後一種定義方式。數組是有排序的,如果數組沒有進行過運算,那麼它的序列總是不變的,這和你書寫的時候有關,比如: int array x= ({1,2}); x[0] 就是 1,x[1]就是2。

 

 

mapping 映射,這是別人的翻譯,我習慣直接說 mapping,呵呵。這個類型比較奇特,它有數組的一些特性,比如其他語言的關聯數組,但是又有一些類的特性。由於ES2使用mapping來作為大量數據的定義,所以這個類型可以說是很多人常見到的。一般的定義可以是這樣子的: mapping x = (["a":1,"b":2]); 於是,x["a"]就是1,x["b"]就是2,這很像是關聯數組。需要注意的是,映射是沒有序列的,雖然你總是可以通過keys() 或者 values()獲得一個緊過排序的數組,但是,這個序列和你的書寫毫無關係。簡單的說來, mapping x=(["a":1,"b",2]); 和 mapping x = (["b":2,"a":1]); 結果是一樣的。所以不要試圖實用 mapping 序列來訪問成員,你必須通過關鍵字來訪問。mapping 成員不需要聲明類型,完全根據賦值情況而定。比如上面的例子裡,成員都是整型的。

 

 

object 物件,毫無疑問,LPC的創造者不斷的吸收新的元素來進化LPC,而LPC的物件幾乎完美的。你可以在其他語言看到object或者class類的定義,這些和LPC的object非常相似。但是這裡,object更為強大。一般的定義是:object ob; 物件的一個特性,就是允許外界通過 call_other 來訪問物件內的函數,或者是 ob->foo()。物件中,定義的物件變量,如果想被外部所引用,就必須設定一個函數來指出。這就是國內LPmud大量存在的 query() 類型函數的作用。MUD中的很多東西都是物件,有些物件是顯而易見的,比如room,npc,item,但是skill也是物件,只不過有些物件沒有形狀,沒有重量,也沒其它感性表現,常常給人忽略。對於object處理,大大不同於其它類型。因為它更像是一個實體,一個有著感性的東西。所以 object不能運算,當然也不能用來賦值變化。

 

 

function 函數定義。這是很重要的一個東西,因為Mud需要物件,物件需要函數和變量。沒有函數,就不能構架Mud世界。函數的定義,一般和數組一樣,需要定義函數的類型。比如:int query_int() {} 。注意的是,函數的結尾是不需要分號的。但是函數內的語句還是和一般的語句一樣,需要分號。函數的呼叫,可以在物件內部執行,也可以由外部呼叫,可以使用 call_other也可以使用 "->" 運算符。比如 ob->query_int();

 

 

void 無定義。這個主要用於函數的定義上,如果函數沒有返回值或則不需要返回值,那麼void fun(){}是比較好的方式。

 

 

mixed 這個定義可以用於任何變量或者函數。這個混合含義意味著聲明的變量或者函數是需要變化的。比如我們定義一個變量 mixed ob; 開始的時候,我們需要讓 ob = "aa"; 然後,我們又需要讓它成為一個物件,那麼, ob = this_object();用的最多的地方,是在一個傳遞過來的變量類型是未知的情況,定義函數局部變量。如果你不能確定變量的類型的話,不妨使用 mixed 來定義變量。

 

 

buffer 這個聲明主要用來處理一些efuns返回的數值。很多情況下,Mud世界需要得並不多。

 

 

class 是比較新的一種特性,這和常規的類很相似,是符合人們習慣的一種設定。不過 object 用得更多。與object不同的是,類可以直接引用成員的特性。

 

 

比如:

 

 

Months[i] = new(class month);

sscanf(lines[i], "%s:%s:%d:%d",((class month)Months[i])->Name,((class month)Months[i])->Season,((class month)Months[i])->Days,((class month)Months[i])->DaylightHours);

 

 

 

 

 

--------------------------------------------------------------------------------

 

整理/撰寫:darks(darknomad.yeah.net)

Comments (0)

You don't have permission to comment on this page.