冒号课堂§5.2:数据类型 - 编程入门网
时也不需要。典型的如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代码——
冒号继续讲解:“在Smalltalk、Python和Ruby等动态类型的OOP语言中,只要一个类型具有shout和swim的方法,它就可以为shoutAndSwim所接受。这在C++、Java、C#等静态类型语言中是不可能的[4],除非鸭和蛙在同一继承树上,或者二者均显式实现了一个包含shout和swim的公用接口。” 句号敏锐地指出:“C++是静态类型语言,但它的模板也可实现类似功能,并不需要引入继承关系。” “说得很对!但请接着看下去。”冒号又放出一段投影——
“这里鸡没有swim的方法,鱼没有shout的方法。若采用C++的模板,shoutOrSwim是无法通过编译的。但在支持Duck 类型的语言中,只要在运行期间不让鸡swim、让鱼shout——除非你突发奇想——一切平安无事。”冒号作了个OK的手势。 “动态类型语言真是越看越可爱。”叹号简直垂涎欲滴了。 “Duck类型的哲学是:是什么不重要,重要的是能干什么,颇有些实用主义的味道。这种非继承性多态为软件重用开启了新的窗口,同时也埋下了一些陷阱。由于Duck类型的接口组合是隐性的,其使用者需要比普通interface更小心以避免误用;其维护者也 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |