Type Inference & Duck Typing

本来是要分开写Type Inference和Duck Typing的,不过后来发现Boo的官方网站已经写的比较详细了,所以我这里就把这两项特性合并起来简单介绍一下吧。

Type Inference

所谓的Type Inference(类型推断)就是根据已知条件来推断一个变量的类型,比如如果我有:

str = "This is a string"

 

那么变量str将被判断成System.String类型,在这之后的操作都按照System.String类型进行。假如我有这么一段代码:

str = "string"
str 
= 1

 

这段代码会抛出一个异常,因为str已经是System.String了就不能再给它赋一个System.Int32类型的值了。以上就是简单的Type Inference,下面还有一些示例:

def Method():
   
return "string return type"

class A:
   
private name = ""
   
   # Name属性被推断为name的类型,也就是System.String。
   Name:
      
get:
         
return name

 

Duck Typing

所谓的Duck Typing和以前VB的中的variant比较相像,但又完全不同,variant是一个指定的类型,而duck却不是什么指定的类型,而是一个替代品,它可以替代任何类型,比如:

def Sum(a as duck, b as duck):
   
return a + b

 

这里我可以传进去int,也可以传double,甚至string,虽然会抛异常,也就是说,使用duck的话就不能控制类型了,这也正是duck的用处。一般来说不建议使用Duck Typing,不过可以在自己做小试验的时候使用,这样比较容易试验,不需要考虑类型,比如在Boo的Interpreter下。另外可以利用duck来解决一些Visitor模式相关的问题,还有就是Mixin之类的AOP特性也可以借用Duck Typing来实现。

如果你决定了要在正式版本中使用duck的话,请注意duck的性能是比有类型的变量低的,因为duck底层的实现其实就是把类型定位成Object,然后通过反射调用其成员,因为是字符串指定所以没问题,但是因为是反射所以性能要低些。

posted @ 2005-08-02 11:46  Cavingdeep  阅读(3510)  评论(13编辑  收藏  举报