【问题标题】:Is there any way to pimp a library in Scala 3 except implicits?除了隐式之外,有没有办法在 Scala 3 中拉皮条?
【发布时间】:2021-03-05 13:59:33
【问题描述】:

有没有办法在 scala 3 中拉皮条? (因为隐式将在 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 extension-methods implicit scala-3


【解决方案1】:

在 Scala 3 中,隐式没有被删除,它们只是变成了given + using

http://dotty.epfl.ch/docs/reference/contextual/relationship-implicits.html

你也可以“pimp a library”(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 方式)使用类 + 隐式转换

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)
  }
}

仍然有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 2019-12-13
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多