Scala:带有两个paretneheses的构造函数

Tei*_*raz 3 scala

我是斯卡拉的新手.以下语法是什么意思?

case class User(val id: Long)(val username: String)
Run Code Online (Sandbox Code Playgroud)

我已经读过关于scala的currying,但请解释一下它与上面的构造有关(如果相关).谢谢.

Tza*_*har 5

就像部分应用的函数一样,构造函数(它是构造类型的参数的函数)可以部分应用,在这种情况下:

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)

什么时候有用?

  1. 当您想要为参数的子集构造具有公共值的许多实例时,例如:

    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)
  2. 当您想使用一个参数作为另一个参数的默认值时:

    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)
  3. 当您想要使用implicit参数时,该参数必须位于函数的单独的最后一个参数列表中,如Scala语言规范(第7.2章)中所述:

方法或构造函数只能有一个隐式参数列表,它必须是给定的最后一个参数列表.