2013-05-18 32 views
6

當我看到這種對無數的網站代碼,但它似乎並不編譯:斯卡拉未發現:值x拆包返回元組

def foo(): (Int, Int) = { 
     (1, 2) 
} 

def main(args: Array[String]): Unit = { 
     val (I, O) = foo() 
} 

它失敗的標記線,報告:

  • 沒有發現:價值我
  • 沒有發現:值O

可能是什麼原因呢?

+7

這是因爲它們是大寫字母。檢查http://stackoverflow.com/questions/2727612/scalas-tuple-unwrapping-nuance。 'val(i,o)= foo'將起作用。 – Chirlo

回答

8

問題是在模式匹配中使用大寫字母IO。您應該嘗試用小寫字母val (i, o) = foo()替換它。 Scala Language Specification指出可以將值定義擴展爲模式匹配。例如,定義val x :: xs = mylist擴展爲以下的(參見第39頁):

val x$ = mylist match { case x :: xs => {x, xs} } 
val x = x$._1 
val xs = x$._2 

在你的情況下,該值定義val (i, o) = foo()以類似的方式被擴展。然而,語言規範還規定,該模式匹配包含小寫字母(參見第114頁):

可變圖案x是一個簡單的identi音響ER,其具有較低 字母開始。

3

按斯卡拉naming convention

方法,價值和變量名應在駝峯與第一 字母小寫:

I, O是模式變量。但是,在定義它們時必須謹慎。按照慣例,Scala希望模式變量以小寫字母開始,並且 需要常量以大寫字母開頭。所以,代碼不會編譯。