2016-08-03 98 views
0

如果我上的方法(在这里我的情况类的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) 
          ^

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

(斯卡拉2.11)

+1

已经有你的问题的答案了,但你也可以从Scala-lang开发者给出的同一个问题中解读[这里](http://stackoverflow.com/a/5259946/4804363) ) – Fellrond

+0

是的,你是对的这是上述的重复;耻辱我无法在搜索中找到它。 – Luciano

+0

应该补充说,它可以做'Foo(_,b = 2)',即如果变量参数出现在任何命名参数之前。 – Luciano

回答

0

可惜。您不能使用占位符语法来扩展函数。 这是因为编译器的行为,它试图扩大undersore到最近的位置,然后你将有一个

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

代替

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

在第一个例子中的“A”肯定不是定义匿名函数的上下文会导致错误。

我建议你使用第二个例子来处理命名参数。此外,如果您接受多个参数,则代码非常干净。

1

在语法上,下划线势必在封闭表达,并且分配是一个表达式。

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

这是由解析器完成的,在任何人询问您是否打算命名参数之前。

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