快速业务通道

冒号课堂§5.2:数据类型 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
时也不需要。典型的如ML、Haskell之类的函数式语言,编译器可以通过上下文来进行类型推断(type inference)。”

“如何进行类型推断?”问号有点丈二和尚摸不着头脑。

冒号打了个比方:“假设‘+’号只限于同类型的数据运算,那么从表达式a + 1中可以推出a是整型变量,从b + 1.0中推出b是浮点型变量,从c + “1”中推出c是字符串型变量。这些变量不必事先声明,但一旦类型被推断确定后,便不再更改。由于这些推断都是在程序运行之前进行的,因此仍属于静态类型。它既有动态类型的简洁性,又不失声明式静态类型的安全性,可谓裁长补短啊。”

叹号有些羡慕地说:“还是动态类型语言好,不仅不必声明变量,而且一个变量在不同地方还可以代表不同类型,多省事多方便啊!”

冒号微微颔首:“虽然这种机制也有为人诟病之处,但不可否认,动态类型语言的确有它的优势:简明、快捷、灵活,并且天然具有泛型(generic)特征。值得一提的是,动态类型有一种被称作鸭子类型(duck typing)的形式。”

冒号课堂§5.2:数据类型(3)

时间:2011-06-27 BlogJava xyz98

逗号感到有趣:“鸭子类型?很滑稽的名字。”

“这种类型通俗的说法是:如果一个对象既会走鸭步又会呷呷叫,何妨将其视作鸭子呢?”冒号说着投影出一段Ruby代码——

class Duck            #会叫会游的鸭    def shout      puts ''呷呷呷''    end    def swim      puts ''鸭泳''    end end class Frog             #会叫会游的蛙    def shout      puts ''呱呱呱''    end    def swim     puts ''蛙泳''    end end def shoutAndSwim(duck)  #让一只会叫会游的家伙边叫边游    duck.shout    duck.swim end shoutAndSwim(Duck.new)  #让一只鸭边叫边游 shoutAndSwim(Frog.new) #让一只蛙边叫边游

冒号继续讲解:“在Smalltalk、Python和Ruby等动态类型的OOP语言中,只要一个类型具有shout和swim的方法,它就可以为shoutAndSwim所接受。这在C++、Java、C#等静态类型语言中是不可能的[4],除非鸭和蛙在同一继承树上,或者二者均显式实现了一个包含shout和swim的公用接口。”

句号敏锐地指出:“C++是静态类型语言,但它的模板也可实现类似功能,并不需要引入继承关系。”

“说得很对!但请接着看下去。”冒号又放出一段投影——

class Cock                 #会叫不会游的鸡    def shout      puts ''喔喔喔''    end end class Fish                #会游不会叫的鱼    def swim      puts ''自由泳''    end end def shoutOrSwim(duck, flag)  #让一只会叫或会游的家伙叫或游    flag ? duck.shout : duck.swim end shoutOrSwim(Cock.new, true)    #让一只鸡叫 shoutOrSwim(Fish.new, false)    #让一只鱼游

“这里鸡没有swim的方法,鱼没有shout的方法。若采用C++的模板,shoutOrSwim是无法通过编译的。但在支持Duck 类型的语言中,只要在运行期间不让鸡swim、让鱼shout——除非你突发奇想——一切平安无事。”冒号作了个OK的手势。

“动态类型语言真是越看越可爱。”叹号简直垂涎欲滴了。

“Duck类型的哲学是:是什么不重要,重要的是能干什么,颇有些实用主义的味道。这种非继承性多态为软件重用开启了新的窗口,同时也埋下了一些陷阱。由于Duck类型的接口组合是隐性的,其使用者需要比普通interface更小心以避免误用;其维护者也

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号