當我看到這種對無數的網站代碼,但它似乎並不編譯:斯卡拉未發現:值x拆包返回元組
def foo(): (Int, Int) = {
(1, 2)
}
def main(args: Array[String]): Unit = {
val (I, O) = foo()
}
它失敗的標記線,報告:
- 沒有發現:價值我
- 沒有發現:值O
可能是什麼原因呢?
當我看到這種對無數的網站代碼,但它似乎並不編譯:斯卡拉未發現:值x拆包返回元組
def foo(): (Int, Int) = {
(1, 2)
}
def main(args: Array[String]): Unit = {
val (I, O) = foo()
}
它失敗的標記線,報告:
可能是什麼原因呢?
問題是在模式匹配中使用大寫字母I
和O
。您應該嘗試用小寫字母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,其具有較低 字母開始。
按斯卡拉naming convention,
方法,價值和變量名應在駝峯與第一 字母小寫:
你I, O
是模式變量。但是,在定義它們時必須謹慎。按照慣例,Scala希望模式變量以小寫字母開始,並且 需要常量以大寫字母開頭。所以,代碼不會編譯。
這是因爲它們是大寫字母。檢查http://stackoverflow.com/questions/2727612/scalas-tuple-unwrapping-nuance。 'val(i,o)= foo'將起作用。 – Chirlo