斯卡拉:咖喱的施工人员

Chr*_*hof 20 constructor scala currying

我有以下Scala类:

class Person(var name : String, var age : Int, var email : String)
Run Code Online (Sandbox Code Playgroud)

我想使用Person构造函数作为curried函数:

def mkPerson = (n : String) => (a : Int) => (e : String) => new Person(n,a,e)
Run Code Online (Sandbox Code Playgroud)

这有效,但还有另一种方法可以做到这一点吗?这种方法似乎有点乏味且容易出错.我可以想象像Function.curried这样的东西,但是对于构造函数来说.

Dan*_*ral 20

这将有效:

def mkPerson = (new Person(_, _, _)).curried
Run Code Online (Sandbox Code Playgroud)

  • 只是一个快速的说明,如果你一定要打电话,它也可以使它成为`val mkPerson = ...`.另外,如果Person是一个案例类,你可以简单地使用`(Person.apply _).curried` (2认同)

eri*_*sei 10

这个派对有点晚了,但如果你做Person了一个案例类:

scala> case class Person(name: String, age: Int, email: String)
defined class Person
Run Code Online (Sandbox Code Playgroud)

Scala会Person.apply(String, Int, String)为您生成包含其他内容的伴随对象.然后你可以这样做:

scala> Person.curried
res5: String => (Int => (String => Person)) = <function1>
Run Code Online (Sandbox Code Playgroud)

这是简写​​:

(Person.apply _).curried
Run Code Online (Sandbox Code Playgroud)

它也适用于var参数.


wal*_*lla 8

可能是吧:

val mkPerson = Function.curried((n: String,a:Int,e:String) => new Person (n,a,e))
Run Code Online (Sandbox Code Playgroud)