Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection Scala相当于C#和#x27;s表达式API_Reflection_Scala - Fatal编程技术网

Reflection Scala相当于C#和#x27;s表达式API

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

它们是否等同于scala中的C#表达式API

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

(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
。这不仅会进行数据绑定,还会使用属性的名称,创建类似
的内容。通过这种方式,您可以获得类型安全性(和重构支持),而不需要任何神奇的字符串。