打开主菜单

BOO入門/鴨子類別型

< BOO入門(重定向自BOO/Duck typing

BOO入門 > 鴨子類別型 (上一章:巨集 下一章:使用Boo編譯器)


定義 定義 Duck Typing 是用來描述不檢查型別系統的一種詼諧說法。這個名詞最早是由 Ruby 社群裡的 Dave Thomas 創造,他是這麼說的,"如果它走路像隻鴨,說話也像隻鴨,那麼,它就是隻鴨。",Duck typing 對值的處置也是如此。

雖然 Boo 是個靜態型別的語言,但 Duck Typing 可以讓 Boo 看起來像是動態語言。Duck typing 讓變數能在執行時期才被認定,而不是在編譯時期。儘管這增加了簡單的感覺,但它的確排除了大量的安全關卡(Though this can add a sense of simplicity, it does remove a large security barrier.)。

// Duck Typing 範例
d as duck
d = 5 // 現在設為整數
print d
d += 10 // 它能作任何整數能做的事
print d
d = "Hi there" // 設置為字串
print d
d = d.ToUpper() // 同樣地,它也能作任何字串能做的事。
print d

輸出結果

5
15
Hi there
HI THERE

如果你從工廠或從不可知的函式庫裡載入一些類別的話,Duck typing 非常有用。

建議 建議 預設不要打開 duck typing 選項。它應該只能在少數情況下使用。

要注意的是,booish 直譯器預設是把 duck typing 打開的。你可以使用 interpreter.Ducky = false 來把 duck typing 關閉。

這兒是另一個實用的 duck typing 範例。

// 實用的 Duck Typing
import System.Threading

def CreateInstance(progid):
    type = System.Type.GetTypeFromProgID(progid)
    return type()

ie as duck = CreateInstance("InternetExplorer.Application")
ie.Visible = true
ie.Navigate2("http://www.go-mono.com/monologue/")

while ie.Busy:
    Thread.Sleep(50ms)

document = ie.Document
print("${document.title} 共有 ${document.fileSize} bytes。")

練習编辑

  1. 有沒有可以讓 duck typing 有用武之地的好例子呢?