scala - "Closures"是如何如此强大的抽象,以至于使用它来实现对象系统和基本控制结构?

标签 scala groovy closures

这是来自 programming scala 的引述第1章:

Closures are such a powerful abstraction that object systems and fundamental control structures are often implemented using them


显然,该声明并不是专门针对 Scala 而是针对一般闭包,但我不能
从中很有意义。也许它是只为那些强大的编译器作者准备的一些智慧之珠!
那么谁使用闭包来实现基本的控制结构,为什么?
编辑:我记得在 groovy “使用闭包作为方法调用的最后一个参数”语法中阅读了一些关于自定义控制结构的内容,并使用元类或 use 使结构可用于您的代码。带有 Categories 的关键字.会不会有关系?
编辑:我找到了 groovy 自定义控制结构语法的以下引用 here (幻灯片 38):

Custom control structures

Thanks to closures

  • When closures are last, they can be put “out” of the parentheses
    surrounding parameters
  • unless(account.balance > 100.euros, { account.debit 100.euros })
  • unless(account.balance > 100.euros) { account.debit 100.euros }
  • Signature def unless(boolean b, Closure c)

显然,groovy 提供的是一种语法糖,用于使基于闭包的自定义控制结构看起来像语言本身提供的一流控制结构。

最佳答案

我评论了控制结构的情况。让我评论作为对象的闭包。考虑当你调用一个对象的方法时会发生什么;它不仅可以访问参数列表,还可以访问对象的字段。也就是说,方法/函数在字段上关闭。这与关闭范围内变量的“裸”函数(即,不是对象方法)没有什么不同。然而,对象语法提供了一个很好的抽象和模块化机制。

例如,我可以写

case class Welcome(message: String) {
  def greet(name: String) = println(message + ", " + name)
}
val w = Welcome("Hello")
w.greet("Dean")

对比
val message = "Hello"
val greet = (name: String) => println(message + ", " + name)
greet("Dean")

实际上,在这个例子中,我可以从 Welcome 中删除“case”关键字,这样消息就不会变成字段,但值仍然在范围内:
class Welcome2(message: String) {    // removed "case"
  def greet(name: String) = println(message + ", " + name)
}
val w = new Welcome2("Hello")        // added "new"
w.greet("Dean")

它仍然有效!现在 greet 关闭输入参数的值,而不是字段。
var welcome = "Hello"
val w2 = new Welcome2(welcome)
w2.greet("Dean")     // => "Hello, Dean"
welcome = "Guten tag"
w2.greet("Dean")     // => "Hello, Dean"  (even though "welcome" changed)

但是如果类直接引用外部作用域中的变量,
class Welcome3 {                  // removed "message"
  def greet(name: String) = println(welcome + ", " + name) // reference "welcome"
}
val w3 = new Welcome3
w3.greet("Dean")                  // => "Guten tag, Dean"
welcome = "Buon giorno"
w3.greet("Dean")                  // => "Buon giorno, Dean"

有道理?

关于scala - "Closures"是如何如此强大的抽象,以至于使用它来实现对象系统和基本控制结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5324670/

相关文章:

scala - PlayFramework + ScalaTest + ScalaCheck

parsing - XmlSlurper解析查询结果

java - 在输出中保留 XML 实体 (jSoup)

循环内的 JavaScript 闭包 – 简单的实际示例

Javascript 闭包问题

Scala - 在映射函数中与 lambda 混淆

Scala,Casbah - 如何将列表转换为 MongoDBList?

java - Logback 不写入第 3 方日志服务

Grails:为什么这个服务类是空的?

c# - 带有内部 Lambda 表达式的 Lambda 表达式