Scala相当于C#的Expression API

时间:2010-01-21 07:11:46

标签: reflection scala

它们是否等同于Scala中C#的Expression API?

例如,我想要像这样的lambda:

(Foo) => Foo.bar

并且能够在传递给它的函数中访问“bar”。

4 个答案:

答案 0 :(得分:9)

Scala不支持此功能。 ScalaQL: Language-Integrated Database Queries for Scala描述了Scala中类似LINQ的功能:

  

虽然微软有可能   只需用它来扩展他们的语言   特殊功能,低应用   开发商不是那么幸运。对于   例如,任何人都无法做到   (在Sun Microsystems之外)   在Java中实现任何形式的LINQ   因为语言修改   这将是必需的。我们遇到了一个   尝试的类似问题   在Scala中实现LINQ。

     

幸运的是,Scala实际上是   足够强大的   即使没有,也实现LINQ的形式   添加对表达式树的支持。   通过运营商的组合   重载,隐式转换和   我们控制着名字的语义   已经能够实现同样的目标   没有做任何改变   语言本身。

答案 1 :(得分:6)

有一个实验性的scala.reflect.Code.lift可能很有意思,但简短的答案是否定的,Scala无法以任何形式访问AST(表达式树是C#AST的子集)。

答案 2 :(得分:2)

我不太清楚你想要什么。如果你想要一个为字段返回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 _)将getter h.s变成一个函数。

答案 3 :(得分:1)

不,据我所知。