随笔-341  评论-2670  文章-0  trackbacks-0
    考虑以下代码:
1 def overloading x = "General overloading"
2 func overloading::string->string
3 def overloading str = "String overloading"
4 func overloading T::list T->string
5 def overloading xs = "List overloading"

    这是三个函数,类型分别为:
1     func overloading T1 :: (<T1> -> (system.list system.char)) codefrom 125
2     func overloading :: ((system.list system.char-> (system.list system.char)) codefrom 127
3     func overloading T1 :: ((system.list <T1>-> (system.list system.char)) codefrom 129

    所以当我们写overloading的时候,究竟选择什么呢?三个类型都是可以接受的,而且都是可以完美通过类型推导的。于是我新加了一个规则。首先求出需要的具体类型(可能是含有参数的类型),然后计算从函数类型到具体类型所需要替换的类型参数的个数以及每个类型参数的解,最后计算出一个系数=数量×65536+解的深度和。

    深度的规定比较简单,基本类型深度为1,闭包类型为参数和结果两种类型的深度的最大值加1,带有参数的类型等于最大参数深度加1。所以在这个例子上,我们可以得到,T1到list char的解为T1=list char,list char到list char的解为0,list T1到list char的解为T1=char,系数分别是65538、0和65537,所以理所当然地挑选了第二个。下面看例子:
1 def main114 = overloading 1024
2 def main115 = overloading "Genius Vczh!"
3 def main116 = overloading [1,2,3]

    下面是运行结果:
1 main114返回值:"General overloading"
2 main115返回值:"String overloading"
3 main116返回值:"List overloading"
posted on 2008-12-14 19:42 陈梓瀚(vczh) 阅读(1442) 评论(0)  编辑 收藏 引用 所属分类: 脚本技术

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理