Scala - 在另一个范围内提供隐式值类

Nik*_*ita 5 scala scoping implicit-conversion

我有一个foo包含类的包FStream.package对象foo定义了一些提供扩展器方法的隐式值类FStream.我想将这些值类从包对象中移出并放入它们自己的单独文件中,但我也希望它们在我使用时始终可用FStream(或者最好是当我使用foo包中的任何东西时.是否可以实现这一点?我尝试将隐式值类放入其他对象中,但我无法从对象扩展.尝试将它们放在类或特征中,但隐式值类只能在其他对象中定义.

富/ FStream.scala

package foo

class FStream {
  def makeFoo(): Unit = ???
}
Run Code Online (Sandbox Code Playgroud)

富/ package.scala

package foo

package object foo {

  // I want to move these definitions into separate files:

  implicit class SuperFoo(val stream: FStream) extends AnyVal {
    def makeSuperFoo(): Unit = ???
  }

  implicit class HyperFoo(val stream: FStream) extends AnyVal {
    def makeHyperFoo(): Unit = ???
  }
} 
Run Code Online (Sandbox Code Playgroud)

酒吧/ usage.scala

package bar

import foo._ // something nice and short that doesn't reference individual value classes

val x: FStream = ???
x.makeSuperFoo() // should work
x.makeHyperFoo() // should work
Run Code Online (Sandbox Code Playgroud)

Her*_*lme 5

我建议你先阅读强制性教程.

我的解决方案是使用FStream的伴侣对象.所以你可以导入FStream并获得所有功能.这也使用特征来分隔文件.

富/ FStream.scala

package foo

class FStream {
  def makeFoo(): Unit = ???
}

// companion provides implicit
object FStream extends FStreamOp
Run Code Online (Sandbox Code Playgroud)

富/ FStreamOp.scala

package foo

// value class may not be a member of another class
class SuperFoo(val stream: FStream) extends AnyVal {
  def makeSuperFoo(): Unit = ???
}

class HyperFoo(val stream: FStream) extends AnyVal {
  def makeHyperFoo(): Unit = ???
}
trait FStreamOp {
  // you need to provide separate implicit conversion
  implicit def makeSuper(stream: FStream) = new SuperFoo(stream)
  implicit def makeHyper(stream: FStream) = new HyperFoo(stream)
}
Run Code Online (Sandbox Code Playgroud)

usage.scala

import foo.FStream

object Main {
  def main(args: Array[String]): Unit = {
    val x: FStream = ???
    x.makeSuperFoo() // should work
    x.makeHyperFoo() // should work
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 编辑答案并删除对隐式用法的评论。OP 想要答案,而不是布道。 (2认同)