Scala 2.8的新特性:具名参数
来源:互联网 发布:js数组去空格 编辑:程序博客网 时间:2024/05/22 00:03
什么是具名参数(Named Argument)
具名参数(named argument),就是指可以在调用方法时将值传入到指定名字的参数上。以上面的减法方法为例,为了避免搞混被减数和减数,我们可以指定被减数和减数这两个参数的名字:sub(minuend=100, subtrahend=32),这个就是具名参数(named argument)。使用具名参数(named argument)不但不会产生上面提到的bug,而且可以有效的提高代码的可读性。
Scala 2.8的具名参数(Named Argument)
在Scala 2.8中使用具名参数很简单,就像上面那样就可以。比如我们有一个方法:
在调用的时候指定参数名就可以了:
f(b = getT(), a = getInt())
需要知道的是,像b=getT()这类的参数表达式是按照调用的顺序来执行的,所以在上面的例子中,getT()会在getInt()之前被执行。另外,具名参数还可以和普通的参数传入方式(这里称为位置参数)混合使用,比如:
那么,如果我们在使用"x=expr"这样的具名参数时,x不是参数名的话,Scala会将"x=expr"这个参数看作是对x变量的赋值表达式,且该参数的类型为Unit。例如:
上面的语句执行过后,x的值等于5。
当x既是参数名又是变量名的时候,上面的这种用法就会发生错误。如果将"x=expr"这种表达式用花括号或者圆括号括上的话,Scala就不会将其作为具名参数来处理。同样,如果参数是一个块表达式的话(如f{arg}),也不会作为具名参数来处理。
上面的这个例子说明了一个问题,就是如果在作用域内有变量和参数名相同的时候,该参数名就无法作为具名参数来使用了。这个问题在日常的应用中一定要注意。
具名参数与其它特性结合
又一个不知道该如何翻译的特性。从官方的文档来看,Repeated Parameters是可以被指定的,但是只能指定一次,不能多次指定。但是就我现在的实验来看,貌似Repeated Parameters只能和它的定义一样,在具名参数时出现在最后,如:
def method(a:String, b:Int*)
method(a="ss", b=1,2,3,4,5,6) //OK
method(b=1,2,3,4,5, a="ss") //错误当一个抽象被子类实现或者一个方法被子类覆盖时,参数的名字不必和父类的相同。对类型检查的程序使用具名参数,方法的静态类型会决定应该使用哪个参数名。
好吧,我承认对于重载来说,使用具名参数会有N多的限制。所以没事干还是少给自己找麻烦,下面我写完大家就明白了。
重载就意味着会有许多名字一样但是参数不一样的方法。当对这些方法使用具名参数时,Scala首先会找出所有合适的候选方法,然后再从中选出最合适的。
至于如何寻找合适的候选方法,给出的参数就很重要了。这些参数不但个数得对,而且对应的类型也必须匹配,比如:
从多个合适的候选方法中确定最合适的方法的过程就和具名参数没有什么关系了,仅仅取决于方法签名。
但是,在下面的这个例子中,两个候选方法就无法区别了,因为参数的类型不是基于参数名来比较的:
不过,对于上面的这个例子我一直想不通,官方的原文是:
真的是不太明白这里所说的 "based on their position" 确切的意思到底是什么,所以也就不敢妄加揣测了。但是我觉得对于上面的例子来说是不应该报错的,看看下面的例子:
def f(a: Int, b: String) // #1
def f(a: Int, b: Object) // #2
f(a=1, b="something") // OK,选择#1
f(b=List(1,2,3,4), a=1) // OK,选择#2
让我来大胆的猜想一下:对比这两个例子来看,例子1出现问题的原因可能就是因为参数定义的位置。对于成熟的JVM来说,区分String和Object还是不难的,但是这个是在运行时加以区分的。例子1的问题出现在编译时,也就是说,对于例子1来说,Scala编译器知道要调用名为f的方法,但是从参数类型上来说,Object和String都可以引用"something",也就是说两个f都可以,但是两个f的参数位置是完全不同的,调用哪一个在编译时就需要决定了;但是对于例子2来说,Scala的编译器仅仅确定调用的方法名是f就可以,至于是哪个f就交给JVM动态的来解决吧。最后一个,匿名函数(方法)。
从官方的文档来看,占位符语法是可以和具名参数一起使用的,但是,按照它的例子,我始终没有成功过:
不知道是不是我的理解有误了,反正只有第三种情况是可以用的。如果有知道的牛人希望能帮我指正一下。
实现
总结
- Scala 2.8的新特性:具名参数
- 具名参数
- Scala 2.8的新特性:Type Specialization(类型专门化)
- C#的具名参数与可选参数
- 十八JdbcTemplate具名参数的使用
- Groovy的灵活初始化与具名参数
- Scala 2.8新特性:Default Argument
- Typescript的参数新特性
- 24.scala编程思想笔记——具名参数和缺省参数
- Spring JDBC 具名参数
- java1.5的新特性---可变参数
- Spring-jdbc:使用支持具名参数的JdbcTemplate
- 具名常量的作用
- Scala 2.8中新的数组
- Hibernate的HQL语句中定位参数和具名参数传参
- JAVA5新特性“可变参数”
- [Java5新特性]可变参数
- Typescript(1) 参数新特性
- 定位系统
- 虚拟化测试机房会后的一些个人记录
- 打印基础知识(3)
- 转:设置ALV单元格颜色
- USB
- Scala 2.8的新特性:具名参数
- 总结ASP.NET性能优化
- 打印基础知识(4)
- JS/JQuery 获取多个同名的文本进行操作
- 如何通过腾讯SOSO问问获得巨大IP流量?
- uva 548
- pcb 中的一些基本概念
- C/C++编译器-cl.exe的命令选项
- FreeBSD7.0+opengate+ipfw(网页网关认证)Captive Portal(3)