我一直在尝试使用Scala。我试图了解implicits并遇到了这种情况。
b
的行为是否相同?我的实验表明,它们的行为相同。
由于
implicit val v = 2
// 1.
def testB(a: Int)(b: Int)(implicit i: Int): Int = {
println(a + b + i)
11
}
println(testB(7)(8))
println(testB(7) {
8
})
// 2.
def testC(a: Int): (Int) => Int = {
def innerTest2C(b: Int)(implicit i: Int) = {
println(a + b + i)
11
}
innerTest2C
}
println(testC(7)(8))
println(testC(7) {
8
})
答案 0 :(得分:1)
规则是,只要函数只接受一个参数,就可以用大括号()
替换普通括号{}
。 Curly括号定义一个块,允许您在其中放置多个语句。该块将评估最后一行中表达式的值,就像在所有块中一样。
在2.中,函数testC返回从Int
到Int
的另一个函数,因此您可以使用一个参数testC(7)
再次调用testC(7)(x)
的结果。如果您只考虑println语句,那么这里没有什么不同。
您需要了解的是
def testB(a: Int)(b: Int)
与
不同def testB(a: Int, b: Int)
前者表示前者代表两种功能,如第二种情况。您可以调用testB(x)并从Int
到Int
获取另一个函数。仅应用函数的部分参数以获得另一个函数称为currying。