Scala, эквивалентный API-интерфейсу С#
Является ли их эквивалент С# Expression API в scala?
Например, я хотел бы иметь такую лямбда:
(Foo) => Foo.bar
и иметь доступ к "бару" в функции, которую он передал.
Ответы
Ответ 1
Это не поддерживается Scala. ScalaQL: языковые интегрированные запросы к базе данных
для Scala описывает LINQ-подобную функциональность в Scala:
Пока Microsoft может просто расширьте свой язык этим особенность, низкое применение разработчикам не очень повезло. Для например, нет никого (за пределами Sun Microsystems) до реализовать любую форму LINQ в Java из-за языковых модификаций которые потребуются. Мы столкнулись с подобная проблема, пытающаяся реализуйте LINQ в Scala.
К счастью, Scala на самом деле достаточно мощный и само по себе реализовать форму LINQ даже без добавление поддержки деревьев выражений. Через комбинацию оператора перегрузки, неявных преобразований и контролируемой семантикой по имени, мы смогли добиться того же без каких-либо изменений сам язык.
Ответ 2
Существует экспериментальный scala.reflect.Code.lift
, который может представлять интерес, но короткий ответ - нет, Scala не имеет доступа к AST в любой форме (деревья выражений являются подмножеством С# AST).
Ответ 3
Мне не совсем понятно, чего вы хотите. Если вы хотите функцию, которая возвращает getter для поля, вы можете сделать это довольно легко:
class Holder(var s: String) { }
class StringSaver(f: Holder => (() => String), h: Holder) {
val getter = f(h)
def lookAtString = getter()
}
val held = new Holder("Hello")
val ss = new StringSaver((h: Holder) => (h.s _) , held)
println(ss.lookAtString)
held.s = "Bye now"
println(ss.lookAtString)
Ключ должен превратить геттер h.s в функцию через (h.s _).
Ответ 4
Нет, насколько мне известно.