除了隐含之外,有没有办法在 Scala 3 中拉皮条库?
Is there any way to pimp a library in Scala 3 except implicits?
有没有办法在 scala 3 中拉皮条库? (因为 implicits 将在 scala 3 中被删除)
那么有什么方法可以使用“给定和使用”来做到这一点吗?
在 scala 2 中,我通常会做这样的事情:
implicit class ListOps[T](list: List[T]) {
// just for the sake of example
def myFlatMap(f: T => List[T]): List[T] = {
if (this.list.tail.isEmpty) f(this.list.head)
else f(this.list.head) ++ this.list.tail.myFlatMap(f)
}
}
在 Scala 3 中,implicits 没有被删除,它们只是变成了 given
+ using
.
http://dotty.epfl.ch/docs/reference/contextual/relationship-implicits.html
您也可以“给图书馆拉皮条”(Scala 3 方式)引入扩展方法
extension [T](list: List[T]) def myFlatMap(f: T => List[T]): List[T] = {
if (list.tail.isEmpty) f(list.head)
else f(list.head) ++ list.tail.myFlatMap(f)
}
http://dotty.epfl.ch/docs/reference/contextual/extension-methods.html
或(模拟 Scala 2 方式)使用 class + 隐式转换
import scala.language.implicitConversions
class ListOps[T](list: List[T]) {
def myFlatMap(f: T => List[T]): List[T] = {
if (this.list.tail.isEmpty) f(this.list.head)
else f(this.list.head) ++ this.list.tail.myFlatMap(f)
}
}
given [T] as Conversion[List[T], ListOps[T]] = ListOps(_)
http://dotty.epfl.ch/docs/reference/contextual/conversions.html
实际上,
implicit class ListOps[T](list: List[T]) {
def myFlatMap(f: T => List[T]): List[T] = {
if (this.list.tail.isEmpty) f(this.list.head)
else f(this.list.head) ++ this.list.tail.myFlatMap(f)
}
}
仍然有效。
有没有办法在 scala 3 中拉皮条库? (因为 implicits 将在 scala 3 中被删除) 那么有什么方法可以使用“给定和使用”来做到这一点吗?
在 scala 2 中,我通常会做这样的事情:
implicit class ListOps[T](list: List[T]) {
// just for the sake of example
def myFlatMap(f: T => List[T]): List[T] = {
if (this.list.tail.isEmpty) f(this.list.head)
else f(this.list.head) ++ this.list.tail.myFlatMap(f)
}
}
在 Scala 3 中,implicits 没有被删除,它们只是变成了 given
+ using
.
http://dotty.epfl.ch/docs/reference/contextual/relationship-implicits.html
您也可以“给图书馆拉皮条”(Scala 3 方式)引入扩展方法
extension [T](list: List[T]) def myFlatMap(f: T => List[T]): List[T] = {
if (list.tail.isEmpty) f(list.head)
else f(list.head) ++ list.tail.myFlatMap(f)
}
http://dotty.epfl.ch/docs/reference/contextual/extension-methods.html
或(模拟 Scala 2 方式)使用 class + 隐式转换
import scala.language.implicitConversions
class ListOps[T](list: List[T]) {
def myFlatMap(f: T => List[T]): List[T] = {
if (this.list.tail.isEmpty) f(this.list.head)
else f(this.list.head) ++ this.list.tail.myFlatMap(f)
}
}
given [T] as Conversion[List[T], ListOps[T]] = ListOps(_)
http://dotty.epfl.ch/docs/reference/contextual/conversions.html
实际上,
implicit class ListOps[T](list: List[T]) {
def myFlatMap(f: T => List[T]): List[T] = {
if (this.list.tail.isEmpty) f(this.list.head)
else f(this.list.head) ++ this.list.tail.myFlatMap(f)
}
}
仍然有效。