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 阅读(1399) 评论(13)  编辑 收藏 所属分类: Python & Boo

  回复  引用  查看    
#1楼 2005-08-02 13:25 | idior      
动态语言的关键不就在类型不定上吗?
一直想知道动态语言如何实现多态,能介绍一下吗?
  回复  引用  查看    
#2楼 2005-08-02 14:06 | Ninputer      
所以其实和VB是一样的嘛。你那个代码VB照样能写
Function Add(a, b)
Return a + b
End Function

完全符合VB的语法,而且无论传什么(定义有加法运算符)进取都能得到结果。
  回复  引用  查看    
#3楼 2005-08-02 14:57 | Cavingdeep      
@idior
有道理:)关于多态,如果你说Python的话,因为它支持OOP,所以可以通过OOP的手段支持多态,另外,因为Python也支持FP,所以也可以通过FP的手段来支持多态(Parametric Polymorphism)。

@Ninputer
所以我说是相像的嘛,但是从原理(或实现)角度来讲,它们是完全不一样的,variant是16bytes长度的一个类型,是一个精确指定的类型,而duck没有类型,只是编译器的一个小把戏。我是从这个角度说它们是不一样的的。
  回复  引用  查看    
#4楼 2005-08-02 15:15 | idior      
通过FP的手段来支持多态(Parametric Polymorphism)。
我指得就是这个, 能否有空介绍一二或者给点链接.
  回复  引用  查看    
#5楼 2005-08-02 15:35 | Ninputer      
No,我说的VB一律指最新版本的(目前是VB.NET或2005)。这里a,b不是Variant,而是Object。而且就算是Variant,这里面没有编译器支持是绝对做不到的。比如支持+。你可以试验下,这样的语法在C#里是无论如何做不到的,即使C#也有Object类型。
  回复  引用  查看    
#6楼 2005-08-02 15:42 | Ninputer      
我现在已经可以确定,这Duck Type和VB的后期绑定从语法到原理上都是一样的,而VB无疑具有更高的功能和可靠性。VB的后期绑定支持泛型、运算符重载和无符号整数,支持可变数参数和可选参数,还支持重载挑选。
  回复  引用  查看    
#7楼 2005-08-02 15:51 | FantasySoft      
感觉Type Duck就是Boo存在类型检查的衍生品。
  回复  引用  查看    
#8楼 2005-08-02 17:37 | Cavingdeep      
@Ninputer
原来你说的是VB.NET 2005的新功能啊,难怪!^_^自从很久以前就没再关注VB.NET了。感觉VB已经不是VB了,语法已经不那么好看了,还不如用C#来的爽!:)个人观点而已!
  回复  引用  查看    
#9楼 2005-08-02 20:32 | Cavingdeep      
@idior
我只有这个链接:
http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
  回复  引用  查看    
#10楼 2005-08-02 22:37 | Ninputer      
@Cavingdeep
这不是VB2005的新增功能,而是从VB1.0到VB2005,一个版本也没少过的功能。微软显然对此非常有经验。而且,我相信从VB4开始,后期绑定的实现原理就基本上没有变过。你说Variant与Duck是不同的,其实根本完全相同。Duck会被擦除成Object,而Variant与Object扮演了相同角色,就是包容一切类型的类型。而不管是Object还是Variant,实现在其上面执行操作,要么需要编译器在背后使用IDispatch,要么需要反射,前者正是VB4-6的实现原理,而VB7-8和Boo则使用反射。所以,这是一个已经至少存在了13年的技术,不是Boo和Python这种小辈语言的专利。
说到语法,不管你是否喜欢VB.NET的语法,它是一种具有专业级水准的开发工具,品质可靠而且广为应用。如果用户需要动态使用对象(比如COM互操作,或者反射调用类库中的类),那么选择VB要比选择Boo之类的可靠得多。

PS,举个动态类型+后期绑定的例子
Dim x, y '没有指定类型哦,你理解成duck也没问题
y = 10
x = New List(Of Integer)
x.Add(y)
x.Add(20)
y = x.FindAll(GreaterThan(15)) '我的VBFP语法
For Each x In y
  Console.WriteLine(x)
Next

这语法在C#这类静态语言中根本是无法想象的。
  回复  引用  查看    
#11楼 [楼主]2005-08-03 09:57 | Cavingdeep      

我来一个用Boo写的,Python当然也可以这样。

y = 10
x = [y, 20]
z = [n in x if n > 15]
for n in z:
   print n

  回复  引用  查看    
#12楼 2005-09-21 14:54 | Ninputer      
现在有VB9.0了,再来一个版本
Dim y = 10
Dim x = {y, 20}
Dim z = Select It From n In x Where n > 15
z.ForEach(AddressOf WriteLine);
  回复  引用    
#13楼 2005-10-31 13:42 | mi [未注册用户]
Python1990年开发出来的,现在有十五年历史了。怎么变成VB的小辈了。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-19 09:57 编辑过


相关链接: