Reflection Scala相当于C#和#x27;s表达式API
它们是否等同于scala中的C#表达式API 例如,我想要一个像这样的lambda:Reflection Scala相当于C#和#x27;s表达式API,reflection,scala,Reflection,Scala,它们是否等同于scala中的C#表达式API 例如,我想要一个像这样的lambda: (Foo) => Foo.bar 并且能够访问传递给它的函数中的“bar”。Scala不支持这一点。描述Scala中类似LINQ的功能: 而微软有可能 简单地用这个扩展他们的语言 独特的功能,低应用 开发商就没有这么幸运了。对于 例如,任何人都没有办法 (太阳微系统外部)至 在Java中实现任何形式的LINQ 因为语言的修改 这是必须的。我们面临着一场灾难 类似的问题试图解决 在Scala中实现LINQ
(Foo) => Foo.bar
并且能够访问传递给它的函数中的“bar”。Scala不支持这一点。描述Scala中类似LINQ的功能: 而微软有可能 简单地用这个扩展他们的语言 独特的功能,低应用 开发商就没有这么幸运了。对于 例如,任何人都没有办法 (太阳微系统外部)至 在Java中实现任何形式的LINQ 因为语言的修改 这是必须的。我们面临着一场灾难 类似的问题试图解决 在Scala中实现LINQ 幸运的是,Scala实际上是 本身足够强大,足以 实现LINQ的一种形式,即使没有 添加对表达式树的支持。 通过组合运算符 重载、隐式转换和 受控的按名称调用语义,我们 我们已经能够实现同样的目标 eect无需对其进行任何更改 语言本身
不,据我所知。有一个实验性的
scala.reflect.code.lift
可能会引起兴趣,但简短的回答是不,scala没有任何形式的AST访问权限(表达式树是C#的AST的子集)。我不太清楚你想要什么。如果您想要一个为字段返回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转换为函数。是的,但作者没有发布其源代码;此外,该文件缺少完整实现所需的许多细节——他们甚至没有编写库的实际接口。例如,支持flatMap(在所有示例中都没有使用)是很棘手的。我不确定它是否实现了LINQ所做的一切,但我只想指出,Slick使用了上述方法。它实现了自己的map、filter、groupBy等函数,这些函数隐式地从常规scala类型转换为特殊的Rep类型。因此,您可以执行
coffes.filter(u.price>8.0).map(u.name)
并将其转换为SQL。在.NET中使用的一种方法是在MVC模板帮助程序中。模板知道模型的类型,比如User(有名字)。因此,您可以为(m=>m.firstName)执行helpers.textBoxFor
。这不仅会进行数据绑定,还会使用属性的名称,创建类似
的内容。通过这种方式,您可以获得类型安全性(和重构支持),而不需要任何神奇的字符串。