2015-11-19 65 views
6

據斯卡拉規格Section 4.6.3爲什麼默認參數不允許在帶重複參數的Scala部分?

不允許在重複參數的參數部分定義任何默認參數。

事實上,如果我定義了以下案例類:

case class Example(value: Option[String] = None, otherValues: String*) 

結果我得到的是根據說明書中的預期:

error: a parameter section with a `*'-parameter is not allowed to have default arguments 
    case class Example(value: Option[String] = None, otherValues: String*) 

但問題是,爲什麼是這樣的不允許?這個類的第一個論點完全獨立於重複的論證,爲什麼這個限制是地方?

回答

6

因爲你可以這樣做:

case class Example(value: String = "default", otherValues: String*) 

現在,如果你打電話Example("Hello", "world"),做的第一"Hello"屬於valueotherValues

你可能會爭辯說,你的例子中的類型是不同的,但是規則變得太複雜了。例如重複的參數經常與Any類型一起使用。這個例子case class Example(value: Option[String] = None, otherValues: Any*)有不同的類型,但仍然與同樣的問題鬥爭

+0

正確,總是有意義的。閱讀答案後,似乎很明顯,我覺得有點愚蠢,因爲我不知道自己:) – djsecilla

+1

這種歧義只是一個模棱兩可,如果你想它。例如,您的示例在Ruby中工作得很好,而Ruby甚至沒有類型指導的優勢。 Ruby甚至允許在(位置)參數列表的開始和結束時強制性的位置參數。基本上,開始時強制性的位置參數首先從左到右進行綁定,然後在從右到左的端點處強制性的位置參數,然後從左到右可選的位置參數,然後是其餘的位置參數。 –

+3

所有這些後面跟着強制關鍵字參數,可選關鍵字參數和最後關鍵字參數。所以,其原因不一定是「它不可能變得毫不含糊」,而是「使它明確不符合其他語言的簡單性」。因此,如果遵循Ruby規則,並且沒有歧義,''Hello''綁定到'value'並且'Seq(「world」)'綁定到'otherValues'。 –

相關問題