當使用上下文綁定類型參數時,有沒有辦法使用更短的語法?目前我有這樣的東西上下文邊界的語法較短?
case class Vector2D[a : Numeric](x: a, y: a) {
val numA = implicitly[Numeric[a]]
def length2 = numA.plus(numA.times(x, x), numA.times(y, y))
}
它使更復雜的公式不可讀。
當使用上下文綁定類型參數時,有沒有辦法使用更短的語法?目前我有這樣的東西上下文邊界的語法較短?
case class Vector2D[a : Numeric](x: a, y: a) {
val numA = implicitly[Numeric[a]]
def length2 = numA.plus(numA.times(x, x), numA.times(y, y))
}
它使更復雜的公式不可讀。
試試這個REPL會話:
scala> case class Vector2D[T : Numeric](x: T, y: T) {
val numeric = implicitly[Numeric[T]]
import numeric._
def length2 = (x*x)+(y*y)
}
defined class Vector2D
scala> Vector2D(3,4).length2
res0: Int = 25
這是因爲數字包含一個名爲mkNumericOps,你可以導入,如上圖所示的隱式轉換。如果沒來開箱,你的方法可能推出這種自己會是這樣的:
scala> implicit class NumericOps[T](val x: T) extends AnyVal { def +(y: T)(implicit n: Numeric[T]): T = n.plus(x, y)
| def *(y: T)(implicit n: Numeric[T]): T = n.times(x, y)
| }
defined class NumericOps
scala> case class Vector2D[a : Numeric](x: a, y: a) { def length2 = (x*x)+(y*y) }
defined class Vector2D
scala> Vector2D(3,4).length2
res0: Int = 25
如果您NumericOps
不是值類(不延長AnyVal),則可以在隱式數值去構造函數而不是每個方法,這可能會更好,或者不重要。
反正有沒有必要寫你自己的,因爲數字已經mkNumericOps
。
這些「ops」類被稱爲「豐富我的圖書館」模式。
只是
import Numeric.Implicits._
然後每一種類型,對於其中隱含的數字,可以發現
(由@Havoc數p作爲建議進口只是一個數字實例的NumericOps轉換爲您提供了更精細的控制,到哪些類型的操作可用,但大多數時候,Numeric.Implicits
應該沒問題)
關於更一般的問題是使用上下文邊界類型參數時,語法較短:通常,沒有噸。正如Numeric在這裏所做的那樣,由類型類提供一些糖使其易於使用。
例如,它或多或少習慣在這使得越來越實例一點比隱含
object Ordering {
def apply[T](implicit ord: Ordering[T]): Ordering[T] = implicitly[Ordering[T]]
}
這樣更容易,你可以得到的隱性只是如同伴對象中的應用方法Ordering[Int]
,而不是implicitly[Ordering[Int]]
。
你不需要'val numeric =隱式[Numeric [T]]'行,你永遠不會使用它。 – lmm 2014-11-08 23:11:45
它用在下一行? 'import numeric._' – 2014-11-09 02:54:21