我试图理解这种多参数子句的语言特性的要点以及为什么要使用它。
例如,这两个函数之间到底有什么区别?
class WTF {
def TwoParamClauses(x : Int)(y: Int) = x + y
def OneParamClause(x: Int, y : Int) = x + y
}
>> val underTest = new WTF
>> underTest.TwoParamClauses(1)(1) // result is '2'
>> underTest.OneParamClause(1,1) // result is '2'
里面有关于这个的东西第 4.6 点的 Scala 规范。看看这对你是否有意义。
注意:规范将这些称为“参数子句”,但我认为有些人也可能将它们称为“参数列表”。
以下是多个参数列表的三个实际用途,
-
帮助类型推断。当使用高阶方法时,这特别有用。下面,类型参数A
of g2
从第一个参数推断出x
,所以第二个参数中的函数参数f
可以省略,
def g1[A](x: A, f: A => A) = f(x)
g1(2, x => x) // error: missing parameter type for argument x
def g2[A](x: A)(f: A => A) = f(x)
g2(2) {x => x} // type is inferred; also, a nice syntax
-
对于隐式参数。只有最后一个参数列表可以标记为隐式,并且单个参数列表不能混合隐式和非隐式参数。的定义g3
下面需要两个参数列表,
// analogous to a context bound: g3[A : Ordering](x: A)
def g3[A](x: A)(implicit ev: Ordering[A]) {}
-
要根据先前的参数设置默认值,
def g4(x: Int, y: Int = 2*x) {} // error: not found value x
def g5(x: Int)(y: Int = 2*x) {} // OK
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)