我是斯卡拉的新手.以下语法是什么意思?
case class User(val id: Long)(val username: String)
Run Code Online (Sandbox Code Playgroud)
我已经读过关于scala的currying,但请解释一下它与上面的构造有关(如果相关).谢谢.
就像部分应用的函数一样,构造函数(它是构造类型的参数的函数)可以部分应用,在这种情况下:
scala> case class User(val id: Long)(val username: String)
defined class User
scala> val userBuilder = User(123L) _
userBuilder: String => User = <function1>
Run Code Online (Sandbox Code Playgroud)
注意由此而来的类型userBuilder-这是一个函数从String(其余参数)User
现在,与部分应用的函数一样,您可以将此结果应用于String并获取User实例:
scala> val user = userBuilder("a")
user: User = User(123)
scala> user.username
res1: String = a
Run Code Online (Sandbox Code Playgroud)
什么时候有用?
当您想要为参数的子集构造具有公共值的许多实例时,例如:
case class Person(lastName: String)(val firstName: String)
class Family(lastName: String, firstNames: List[String]) {
def getMembers: List[Person] = {
val creator = Person(lastName) _ // will be reused for each first name!
firstNames.map(creator)
}
}
Run Code Online (Sandbox Code Playgroud)当您想使用一个参数作为另一个参数的默认值时:
case class Measure(min: Int)(val max: Int = min*2)
Measure(5)() // max = 10
Measure(5)(12) // default overridden, max = 12
Run Code Online (Sandbox Code Playgroud)当您想要使用implicit参数时,该参数必须位于函数的单独的最后一个参数列表中,如Scala语言规范(第7.2章)中所述:
方法或构造函数只能有一个隐式参数列表,它必须是给定的最后一个参数列表.