2011-04-26 64 views
3

有沒有另一種方式使這項工作?作爲斯卡拉默認的第一個參數

def b(first:String="hello",second:String) = println("first:"+first+" second:"+second) 

b(second="geo") 

如果我打電話只用方法:

b("geo") 

我得到:

<console>:7: error: not enough arguments for method b: (first: String,second: String)Unit. 
Unspecified value parameter second. 
     b("geo") 
+0

def b(second:String)= b(「hello」,second) – tuxSlayer 2011-04-27 09:51:09

回答

5

這裏是可能的方法之一:您可以使用多個參數列表和柯里:

scala> def b(first:String="hello")(second:String) = println("first:"+first+" second:"+second) 
b: (first: String)(second: String)Unit 

scala> b()("Scala") 
first:hello second:Scala 

scala> val c = b() _ 
c: (String) => Unit = <function1> 

scala> c("Scala") 
first:hello second:Scala 
2

提供單個字符串參數eter(沒有命名)對於編譯器來說太模糊了。 可能你的意思是非默認參數的值,但是......也許不是。所以編譯器希望你更具體。

通常,您將所有默認參數放在方法簽名的末尾(如果您在這種情況下執行此操作,則b("geo")將起作用),以便可以將它們省略掉。

3

見Scala語言規範6.6.1(http://www.scala-lang.org/docu/files/ScalaReference.pdf):

「的命名參數形成的參數列表E1的蘇夫科幻X, ...,em,即沒有位置參數跟在一個名字之後。「