我有以下幾點:斯卡拉:放在哪裏@unchecked標註在foreach
samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)}
我知道一個「案例」將匹配所有可能的值,但我得到一個「比賽並不詳盡' 警告。 Scala書籍解釋了將@unchecked註釋放在正常完全指定的匹配表達式上的位置,但不是上面的表單。我如何註釋上面的內容來阻止編譯器抱怨?
我有以下幾點:斯卡拉:放在哪裏@unchecked標註在foreach
samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)}
我知道一個「案例」將匹配所有可能的值,但我得到一個「比賽並不詳盡' 警告。 Scala書籍解釋了將@unchecked註釋放在正常完全指定的匹配表達式上的位置,但不是上面的表單。我如何註釋上面的內容來阻止編譯器抱怨?
@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)
})
並且您沒有任何警告,因爲它期待着部分功能。
爲什麼不添加一個虛擬案例,如果你確信它永遠不會發生?
samples.sliding (2).foreach {
case List (a, b) => printf ("%x %x\n", a.value, b.value)
case _ => sys.error ("impossible")
}
因爲我知道catchall永遠不會被採取,因此是不必要的。我可以用一個單獨的def來完成它,並且註釋它是在ProgInScala書的p288中記錄的,但我正在試圖弄清楚如何註釋一個foreach,就像我在問題中所說的那樣。 –
不知道有關@unchecked
,但爲什麼不就叫x.head
和x.tail.head
或x(0)
和x(1)
?
是的,這會工作,但我更喜歡斯卡拉匹配運算符:-) –
剛剛發佈之後,我到了那裏,謝謝反正 - 雖然我希望有一些回覆點來回答我自己的問題;-) PF到CF的轉換是棘手的,因爲沒有明確的轉換,儘管我看到了什麼。謝謝,無論是答案還是無核方法。 –