Лучший способ определить неявный класс, которому нужен параметр во время выполнения - PullRequest
0 голосов
/ 27 марта 2020

У меня есть неявный класс, который должен использовать данный параметр во время выполнения. Поэтому я определяю это неявно в другом классе, который принимает этот параметр в конструкторе. Упрощенная версия того, что я делаю, выглядит следующим образом:

case class A(p1: String) {
    def foo = println("foo: " + p1)
}

class B(p2: String) {
    implicit class Enhancer(a: A) {
        implicit def bar = s"bar: ${a.p1}, $p2"
    }
}

Поэтому, когда мне нужно использовать этот класс, я делаю следующее:

val a = A("x")

val b = new B("y")
import b._

a.bar

Мне интересно, есть ли аккуратнее, чем выше? В частности, две средние строки, где я определяю объект, а затем импортирую из него. Например, есть ли способ, которым я мог бы вызвать одну строку, чтобы вернуть неявный класс, который мне нужен?

1 Ответ

3 голосов
/ 27 марта 2020

Попробуйте добавить неявный параметр к Enhancer.

case class A(p1: String) {
  def foo = println("foo: " + p1)
}

class B(val p2: String)

implicit class Enhancer(a: A)(implicit b: B) {
  implicit def bar = s"bar: ${a.p1}, ${b.p2}"
}

val a = A("x")

implicit object b extends B("y")

a.bar

или

implicit val b = new B("y")

a.bar

или

implicit class Enhancer(val a: A) extends AnyVal {
  implicit def bar(implicit b: B) = s"bar: ${a.p1}, ${b.p2}"
}
...