它们是否等同于Scala中C#的Expression API?
例如,我想要像这样的lambda:
(Foo) => Foo.bar
并且能够在传递给它的函数中访问“bar”。
答案 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)
不,据我所知。