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

Нет, насколько мне известно.