Макросы scala: добавление функции в класс
Я новичок в макросах scala и использую scala 2.10.0-RC3.
Я хочу написать макрос, который добавляет функцию к классу. Пример использования:
trait MyTrait {
def addF = macro { /*add "def f = 3" to class*/ }
}
class MyClass extends MyTrait {
addF //Adds the "def f" to MyClass
}
object Main {
val t = new MyClass
assert(t.f==3)
}
Мне нужно это в следующем сценарии. Моя первая попытка не использовала макросы, но не работала, потому что я не могу наследовать одну и ту же черту дважды.
trait AddF[T] {
def f(t: T) { /* ...do sthg ... */ }
}
class MyClass extends AddF[Int] with AddF[String]
С помощью макро решения я мог бы написать
class MyClass extends MyTrait {
addF[Int]()
addF[String]()
}
Есть ли способ сделать это с помощью макросов Scala? Или есть другой способ добиться этого?
2 ответа
В настоящее время невозможно добавлять, изменять или удалять определения, видимые вне макроса. Т.е. вы можете создать класс или метод, локальный для расширения (например, создать дерево ClassDef как часть результата, возвращаемого вашим макросом), но нет возможности воздействовать на внешний мир.
Однако мы планируем поэкспериментировать с этой функциональностью, которая примерно представлена в http://scalamacros.org/future.html. Также уже есть солидный прототип, который может генерировать новые классы верхнего уровня. Свяжитесь со мной для деталей, если вы хотите посмотреть.
Если я не совсем запутался, простая перегрузка должна обеспечить желаемое поведение? Например, это будет работать:
trait MyTrait {
def f(i: Int)
def f(i: String)
}
class MyClass extends MyTrait {
def f(i: Int) {
println(i + " was an Int")
}
def f(s: String) {
println(s + " was a String")
}
}
// this allows:
val c = new MyClass()
c.f("hello")
c.f(42)