Scala, эквивалентный C # Expression API - PullRequest
14 голосов
/ 21 января 2010

Являются ли они эквивалентом API выражений C # в scala?

Например, я бы хотел, чтобы лямбда была такой:

(Foo) => Foo.bar

и иметь доступ к «bar» в функции, которой он передан.

Ответы [ 4 ]

9 голосов
/ 21 января 2010

Это не поддерживается Scala. ScalaQL: запросы к базе данных, интегрированные в язык для Scala описывает LINQ-подобную функциональность в Scala:

Хотя для Microsoft возможно просто расширить свой язык с этим особенность, непритязательное приложение разработчикам не так повезло. За например, никому нет пути (вне Sun Microsystems) для реализовать любую форму LINQ в Java из-за языковых мотивов что будет необходимо. Мы столкнулись с аналогичная проблема, пытаясь внедрить LINQ в Scala.

К счастью, Scala на самом деле достаточно мощный сам по себе, чтобы реализовать форму LINQ даже без добавлена ​​поддержка деревьев выражений. Через комбинацию оператора перегрузка, неявные преобразования и управляемая семантика вызова по имени, мы смогли добиться того же без каких-либо изменений сам язык.

6 голосов
/ 21 января 2010

Существует экспериментальный scala.reflect.Code.lift, который может представлять интерес, но краткий ответ - нет, Scala не имеет доступа к AST в любой форме (деревья выражений являются подмножеством AST C #).

2 голосов
/ 21 января 2010

Мне не совсем понятно, чего вы хотите. Если вам нужна функция, которая возвращает геттер для поля, вы можете сделать это довольно легко:

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 _).

1 голос
/ 21 января 2010

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

...