Допустим, у меня естьсинтаксический сахар для создания объекта времени компиляции в Scala
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:
Вы хотите сериализовать функцию на удаленном компьютере? Что вы понимаете, создавая экземпляр класса «только от имени класса». Что такое класс или имя класса в этом примере? –
В принципе, я хочу иметь код Foo (Int => Int): String, который что-то возвращает. Затем на другой машине, на которой загружен тот же самый файл jar, я хочу запустить Bar (s: String): FooTrait [Int] на этой Строке и иметь Bar (Foo (fn)) вернуть объект, который имеет fn как метод , Один из способов сделать это - def Foo (obj: FooTrait [Int]) = classOf (obj) .toString, а затем Bar создать новый экземпляр класса из имени класса, но для этого требуется передать в класс Foo, а не лямбда. – bsdfish