Является ли это их эквивалентом API-выражения C# в scala?Scala, эквивалентный API выражений C#
Например, я хотел бы иметь лямбда так:
(Foo) => Foo.bar
и быть в состоянии получить доступ к «бар» в функции она передается.
Является ли это их эквивалентом API-выражения C# в scala?Scala, эквивалентный API выражений C#
Например, я хотел бы иметь лямбда так:
(Foo) => Foo.bar
и быть в состоянии получить доступ к «бар» в функции она передается.
Это не поддерживается Scala. ScalaQL: Language-Integrated Database Queries for Scala описывает LINQ-как функциональность в Scala:
Хотя возможно для Microsoft, чтобы просто расширить свой язык с этим конкретной функции, смирен приложения разработчики не так повезло. Например, для нет никого (вне Sun Microsystems) до реализовать любую форму LINQ в Java из-за языковых модификаций , которые потребуются. Мы столкнулись с проблемой , которая пыталась выполнить реализовать LINQ в Scala.
К счастью, на самом деле Scala достаточно мощный сам по себе, чтобы реализовать форму LINQ даже без добавления поддержки деревьев выражений. Благодаря сочетанию оператор перегрузки, неявных преобразований, и контролируемые Call- по имени семантика, мы смогли достичь того же ЕЭТЧ без внесения каких-либо изменений в самого языка.
Нет, насколько мне известно.
Существует экспериментальный scala.reflect.Code.lift
, который может представлять интерес, но короткий ответ - нет, Scala не имеет доступа к AST в любой форме (деревья выражений являются подмножеством AST).
Мне не совсем понятно, что вы хотите. Если вы хотите функцию, которая возвращает поглотитель для поля, вы можете сделать это довольно легко:
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 _).
Один из способов использования этого метода в .NET заключается в помощниках шаблонов MVC. Шаблон знает тип модели, скажем, User (у которого есть firstName). Таким образом, вы можете сделать 'helpers.textBoxFor (m => m.firstName)'. Это не только привязывает данные, но и использует имя свойства, создавая нечто вроде ''. Таким образом, вы получаете безопасность типов (и поддержку рефакторинга) без необходимых магических строк. – ShawnFumo
Да, но автор не выпустил их исходный код; кроме того, на этой бумаге не хватает подробностей, необходимых для полной реализации - они даже не записывают фактический интерфейс своей библиотеки. Поддержка flatMap (которая не используется ни в одном из примеров), например, сложна. – Blaisorblade
Я не уверен, что он реализует все, что делает LINQ, но просто хотел указать, что Slick использует вышеуказанные методы. Он реализует собственные функции map, filter, groupBy и т. Д., Которые неявно отбрасываются из обычных типов scala в специальный тип Rep. Таким образом, вы можете сделать 'coffees.filter (_. Price> 8.0) .map (_. Name)' и он превратится в SQL. [См. Документы] (http://slick.typesafe.com/doc/2.0.0/introduction.html#lifted-embedding). – ShawnFumo