在 Scala 3 關于擴展方法的參考檔案中,它提供了四種可以查找擴展方法的方法。對于第四個,它說:
參考的形式為 rm,擴展方法在某個給定實體中定義在 r 型別的隱式范圍內。
它舉了一個例子:
object List:
...
given [T: Ordering]: Ordering[List[T]] with
extension (xs: List[T])
def < (ys: List[T]): Boolean = ...
end List
但是,您似乎可以輕松地在給定的旁邊定義擴展名:
object List:
...
extension [T: Ordering](xs: List[T])
def < (ys: List[T]): Boolean = ...
given [T: Ordering]: Ordering[List[T]] with
...
end List
提供這種查找擴展方法的第四種方式的動機是什么?只是為了方便,還是允許其他方式無法實作的功能?
uj5u.com熱心網友回復:
但是,您似乎可以輕松地在給定的旁邊定義擴展名:
這意味著需要一遍又一遍地為每個實體定義擴展;盡管在提供的示例中仍然如此。
一個更好的例子是:
trait Functor[F[_]]:
extension [A](fa: F[A])
def map[B](f: A => B): F[B]
final def as[B](b: B): F[A] = fa.map(_ => b)
end Functor
object List:
given Functor[List] with:
extension [A](la: List[A])
override def map[B](f: A => B): List[B] =
...
end List
List(1, 2, 3).as("Foo")
擴展方法將as是開箱即用的。
雖然,我個人認為大多數庫將繼續在syntax要匯入的不同物件上提供擴展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/486227.html
上一篇:如何在Scala中轉換List[Map[String,String]]
下一篇:不推薦使用的命令的SBT警告
