如果我在方法(我的案例类的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)
答案 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"肯定没有在匿名函数的上下文中定义,并且会导致错误。
我建议您使用第二个示例来处理命名参数。此外,如果您接受多个参数,它在代码中会更加清晰。