2013-09-30 67 views
9

我想在scala中爲匿名函數設置默認值,因此無法找到任何解決方案。希望有人能幫助我。在scala中爲函數參數設置默認值

我有以下結構,

case class A(id:Int = 0) 

case class B(a:A) 

object B { 
    def func1(f:Int = 0)={ 
     ........ 
    } 
def func2(f:A => B = (how to give default value ?))={ 
     case Nothing => { 
     //do something.... 
     } 
     case _ => { 
     //do some other thing...... 
     } 
} 
} 

基本上,我想使傳遞參數可選。我怎樣才能做到這一點?

回答

13

像任何其他默認參數:

scala> def test(f: Int => Int = _ + 1) = f 
test: (f: Int => Int)Int => Int 

scala> test()(1) 
res3: Int = 2 

或字符串:

scala> def test(f: String => String = identity) = f 
test: (f: String => String)String => String 

scala> test() 
res1: String => String = <function1> 

scala> test()("Hello") 
res2: String = Hello 

編輯:

在情況下,如果你想使用默認提供的功能,你必須顯式使用(),否則Scala不會粘貼默認參數。

如果你不想使用默認的功能,並提供一個明確的一個,你來就可以提供它:

scala> test(_.toUpperCase)("Hello") 
res2: String = HELLO 
+0

我想知道這個答案是如何涉及到這個問題的,它似乎是關於使用curried函數而不是默認參數? –

+0

@GyroGearless不,你錯了 – 4lex1v

+0

好吧,明白了。但我想你的例子會更具啓發性,如果它有一個非默認情況的例子,例如'test(_ * 33)(1)' –

1

使用隱式參數。在對象中放置參數的隱式值。這將被使用,除非你提供了一個明確的參數,或者你在調用範圍中提供了另一個隱式值。

case class A(id:Int = 0) 

case class B(a:A) 

object B { 
    implicit val defFunc: A => B = {a: A => new B(a) } 
    def func1(f:Int = 0)={ 
    } 
    def func2(implicit func: A => B) = { ... } 
} 

這種方法和Alexlv的方法之間的差異是

  1. 這適用於獨立的功能以及方法。
  2. 範圍規則允許在適當的範圍內提供適當的覆蓋。亞歷克斯的方法將需要子類化或擴展(部分應用程序)來改變默認值。

我提供此解決方案,因爲您已經使用了一個對象。否則,Alexvlv的例子比較簡單。

+0

您的func2方法在使用意義上非常不好。你需要兩個參數列表並返回一個部分函數,​​所以如果你試圖調用結果函數,這將不是你所期望的,即調用'func2(10)'(第二個分支與全部匹配的'_')會拋出一個錯誤,導致'func2'期望一個隱含的參數,並且你給它一個int。我可以從生產中給你提供很多例子,當牽扯(設計靠近你)是一場災難,並且打破了很多。 – 4lex1v

+0

是的。讓我自己因大部分原因試圖離開他原​​來的代碼而受到阻礙。編輯理智。 – itsbruce