"闭包"是如何使用它实现对象系统和基本控制结构的强大抽象?

Tah*_*tar 4 groovy closures scala

以下是编程scala第1章的引用:

闭包是一种强大的抽象,对象系统和基本控制结构通常使用它们来实现

显然这个声明并不是专门针对Scala而是关闭Closures,但我对它没有多大意义.也许它是一些智慧的珍珠,仅适用于那些强大的编译器作者!

那么谁使用Closures实现基本控制结构?为什么?

编辑:我记得读一些有关自定义控制结构中常规"使用的盖,方法调用的最后一个参数"语法和使用元类或提供的结构,你的代码use的关键字与分类.它可能是相关的吗?

编辑:我发现语法常规定制控制结构的下列参考这里(滑块38):

定制控制结构

感谢关闭

  • 当闭包是最后一个时,它们可以被放在
    围绕参数 的括号中
  • unless(account.balance > 100.euros, { account.debit 100.euros })
  • unless(account.balance > 100.euros) { account.debit 100.euros }
  • 签名 def unless(boolean b, Closure c)

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

Dea*_*ler 7

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

例如,我可以写

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

val message = "Hello"
val greet = (name: String) => println(message + ", " + name)
greet("Dean")
Run Code Online (Sandbox Code Playgroud)

实际上,在这个例子中,我可以从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")
Run Code Online (Sandbox Code Playgroud)

它仍然有效!现在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)
Run Code Online (Sandbox Code Playgroud)

但是如果类直接引用外部作用域中的变量,

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"
Run Code Online (Sandbox Code Playgroud)

合理?

  • @Adrian Fritsch:闭包只是一个只有一种方法的对象.方法只是对对象的闭包.这两个基本上是双重的:对象是带附加函数的数据,闭包是附加数据的函数. (5认同)