2016-08-03 150 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)