2012-05-08 28 views
3

我有以下幾點:斯卡拉:放在哪裏@unchecked標註在foreach

samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)} 

我知道一個「案例」將匹配所有可能的值,但我得到一個「比賽並不詳盡' 警告。 Scala書籍解釋了將@unchecked註釋放在正常完全指定的匹配表達式上的位置,但不是上面的表單。我如何註釋上面的內容來阻止編譯器抱怨?

回答

10

@unchecked在一個匹配操作用於選擇器定義,而不是任意的功能。所以你可以

foreach{ x => (x: @unchecked) => x match { case List(a,b) => ... } } 

但這是相當的一口。

或者,你可以創建一個不安全的轉換成一個完整的部分功能(這其實只是投射到PartialFunction功能超類)的方法:

def checkless[A,B](pf: PartialFunction[A,B]): A => B = pf: A => B 

,然後你可以

samples.sliding(2).foreach(checkless{ 
    case List(a,b) => printf("%x %x\n", a.value, b.value) 
}) 

並且您沒有任何警告,因爲它期待着部分功能。

+0

剛剛發佈之後,我到了那裏,謝謝反正 - 雖然我希望有一些回覆點來回答我自己的問題;-) PF到CF的轉換是棘手的,因爲沒有明確的轉換,儘管我看到了什麼。謝謝,無論是答案還是無核方法。 –

-2

爲什麼不添加一個虛擬案例,如果你確信它永遠不會發生?

samples.sliding (2).foreach { 
    case List (a, b) => printf ("%x %x\n", a.value, b.value) 
    case _   => sys.error ("impossible") 
} 
+1

因爲我知道catchall永遠不會被採取,因此是不必要的。我可以用一個單獨的def來完成它,並且註釋它是在ProgInScala書的p288中記錄的,但我正在試圖弄清楚如何註釋一個foreach,就像我在問題中所說的那樣。 –

0

不知道有關@unchecked,但爲什麼不就叫x.headx.tail.headx(0)x(1)

+0

是的,這會工作,但我更喜歡斯卡拉匹配運算符:-) –