BOO入门/鸭子类别型

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 有用武之地的好例子呢?