Предоставляет неявные функции для блока кода в Scala

Предположим, что класс определяет неявную функцию, которая преобразует целое число в строку:

class Dollar() {
  implicit def currency(num: Int): String = "$" + num.toString

  def apply(body: => Unit) {
    body
  }
}

и у нас также есть функция, которая печатает число, преобразованное неявной функцией:

def printAmount(num: Int)(implicit currency: Int => String) {
  println(currency(num))
}

тогда мы можем вызвать метод printAmount() в конструкторе класса Dollar:

val dollar = new Dollar {
  printAmount(32) // prints "$32"
}

Однако, если мы хотим предоставить неявную функцию для блока кода, возникает ошибка компиляции, потому что неявное значение не применяется:

dollar {
  printAmount(14) // Error: No implicit view available from Int => String
}

Как я знаю, у Groovy есть ключевое слово use для случая, как это. Есть ли способ предоставить неявные функции для определенного блока кода в Scala?

1 ответ

Решение

Вы можете изменить доллар таким образом, чтобы он переводил функцию из функции преобразования в Unit,

dollar(f:(Int => String) => Unit) = {
  //...
}

Тогда вы можете использовать доллар так:

dollar ( implicit conversion => {
  printAmount(14)
})
Другие вопросы по тегам