Допустим, у меня есть
trait fooTrait[T] {
def fooFn(x: T, y: T) : T
}
Я хочу, чтобы пользователи могли быстро объявлять новые экземпляры fooTrait со своими собственными определенными телами для fooFn. В идеале я бы хотел что-то вроде
val myFoo : fooTrait[T] = newFoo((x:T, y:T) => x+y)
на работу. Тем не менее, я не могу просто сделать
def newFoo[T](f: (x:T, y:T) => T) = new fooTrait[T] { def fooFn(x:T, y:T):T = f(x,y); }
, потому что при этом используются замыкания, и поэтому при многократном запуске программы создаются разные объекты. Что мне действительно нужно , так это чтобы я мог получить classOf объекта, возвращаемого newFoo, и затем создать его на другом компьютере. Что мне делать?
Если вас интересует сценарий использования, я пытаюсь написать оболочку Scala для Hadoop, которая позволяет выполнять
IO("Data") --> ((x: Int, y: Int) => (x, x+y)) --> IO("Out")
Объект в середине должен быть превращен в класс, который реализует определенный интерфейс, а затем может быть создан на разных машинах (выполняя один и тот же файл JAR) только из имени класса.
Обратите внимание, что Scala правильно делает с синтаксическим сахаром, который преобразует (x: Int) => x + 5 в экземпляр Function1. Мой вопрос заключается в том, могу ли я повторить это, не взломав внутренности Scala. Если бы это был lisp (как я привык), это был бы тривиальный макрос времени компиляции ...: sniff: