具有命名参数的部分应用程序

时间:2016-08-03 11:16:46

标签: scala

如果我在方法(我的案例类的apply()方法)上使用部分应用程序,那么它可以工作:

case class Foo(a : Int, b : Int)

val pf : Int => Foo = Foo(_ ,2)

但是,似乎无法将其与命名参数结合使用,例如: :

case class Foo(a : Int, b : Int)

val pf : Int => Foo = Foo(a = _ ,b = 2)

导致:

Error:(7, 33) not found: value a
lazy val pf : Int => Foo = Foo(a = _ ,b = 2)
                               ^

这有什么办法吗?我需要这个,因为我有大量默认参数的案例类,我不想在大部分时间都指定。

(Scala 2.11)

2 个答案:

答案 0 :(得分:1)

从语法上讲,下划线绑定在封闭表达式上,赋值是表达式。

因此,您的示例会扩展为Foo(x => a = x, b = 2)

在任何人询问您是否打算命名为args之前,解析器已经完成了这项工作。

解决方法:val pf : Int => Foo = i => Foo(a = i ,b = 2)

答案 1 :(得分:0)

不幸的是。你不能使用占位符语法以这种方式扩展函数。 这是因为编译器行为,它试图将下方扩展到最近的位置然后你将有一个

val pf : Int => Foo = Foo((x => a = x) ,b = 2)

而不是

val pf : Int => Foo = x => Foo(a = x ,b = 2)

在第一个例子" a"肯定没有在匿名函数的上下文中定义,并且会导致错误。

我建议您使用第二个示例来处理命名参数。此外,如果您接受多个参数,它在代码中会更加清晰。