我很好奇 - 在Traversable
的foreach
申報方法中,通用類型U
的要點是什麼?foreach中的泛型類型有什麼意義?
def foreach[U](f: A => U): Unit
由於Function1
返回類型是協變的,爲什麼不能說只是:
def foreach(f: A => Any): Unit
?
我很好奇 - 在Traversable
的foreach
申報方法中,通用類型U
的要點是什麼?foreach中的泛型類型有什麼意義?
def foreach[U](f: A => U): Unit
由於Function1
返回類型是協變的,爲什麼不能說只是:
def foreach(f: A => Any): Unit
?
由於不是馬丁·奧德斯基,我只能猜測:-)看看foreach
的斯卡拉多克,我看到這個:
/** Applies a function `f` to all elements of this $coll.
*
* @param f the function that is applied for its side-effect to every element.
* The result of function `f` is discarded.
*
* @tparam U the type parameter describing the result of function `f`.
* This result will always be ignored. Typically `U` is `Unit`,
* but this is not necessary.
*
* @usecase def foreach(f: A => Unit): Unit
*/
所以返回類型f
並不重要,其結果總是被丟棄。對我而言,這表明在這裏使用泛型類型參數來標記返回類型僅僅是一個文檔細微之處,他說「返回類型可以是任何東西,任何東西,你都喜歡」。而返回類型Any
可能暗示(某些)讀者對此處適用的函數類型有一些限制。
另一方面是斯卡拉非常有意識地設計爲從頭開始具有通用性。因此 - 對我來說 - 在這裏使用泛型類型參數與語言的一般原理是一致的,儘管使用Any
- 儘管在技術上可用 - 將是一種絕對非泛型方法,與其他語言不一致。
也許讓你從Traversable
繼承,並從f: A => U
使一些使用返回值U
的?
trait TraversableWithHandler[+A, E <: Option[Throwable]] extends Traversable[A] {
override def foreach[U](f: A => U): Unit
def handleError(t: E)
}
例如在jQuery
,從內foreach
的false
返回相當於break
,任何不同的值是一個continue
。
使用案例
breakable {
List(1,2,3).foreach(_ match {
case 1 => println("ok")
case 2 =>
println("Sort of, soft interrupt?")
return false
case 3 => break
})
}
因爲下一個代碼(平行),從來沒有斷(無堆疊拋出的解決方案似乎是在這種情況下,非理想?):
import scala.util.control.Breaks._
breakable {
(0 to 100).toList.par.foreach(_ match {
case n if (n <= 50) =>
println("#" * 100)
try { break } catch {
case t: Throwable => println("" + t); break
}
case n if (n > 50) =>
println("" + n)
case _ => "ok"
})
}
-1:鑑於無論如何在這種情況下使用無堆棧的異常來控制流,並且具有正式的返回值在這種情況下是沒有用的,這是極不可能的。另外,你實際上並沒有顯示任何用例。我不知道如何使用上面的簽名。 –
這與Scaladoc相反,它說:「函數f的結果被丟棄。」 –
這個答案不僅僅是錯誤的,它可能會讓人困惑。你剛剛重命名了類型參數,以便它影響'scala.Boolean' - 你絕對不會限制'Traversable'中聲明的方法。 –
我沒有時間想出一個例子,但我強烈懷疑它是讓類型推理器在推斷函數的返回類型時忽略'foreach'。但是我不知道一個關係重大的案例(即「任何」不會導致相同的推論)。 –