Генерация функций во время раскрытия макросов - PullRequest
4 голосов
/ 06 июля 2019

Я хотел бы сгенерировать функции для класса, принимающего параметр типа 1

case class C[T] (t: T)

в зависимости от параметра типа T.

Функции, которые я хотел бы генерировать, получены изфункции, доступные в T.

Что бы я хотел точно, это сделать все функции доступными для T, также доступными для C.

В качестве примера для C[Int], я хотел бы иметь возможность вызывать на C любую функцию, доступную на Int, и отправлять вызов функции на Int, содержащийся в C.

val c1 = new C(1)
assert(c1 + 1 == 2)

Как я могудостичь этого с помощью макросов Scala 2 или dotty?Или это может быть достигнуто другим способом?

1 Ответ

3 голосов
/ 06 июля 2019

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

case class C[T] (t: T)

object C { //we define implicit conversion in companion object
  implicit def conversion[T](c: C[T]): T = c.t
}

import scala.language.implicitConversions
import C._

val c1 = C(1)
assert(c1 + 1 == 2) //ok

val c2 = C(false)
assert(!c2 && true) //ok

Использование неявных преобразований означает, что всякий раз, когда компилятор замечает, что типы не совпадают, он пытается неявно преобразовать значение, применяя неявную функцию .

...