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的自定义控制结构看起来像语言本身提供的一流控制结构.
我评论了控制结构的情况.让我评论闭包作为对象.考虑在对象上调用方法时会发生什么; 它不仅可以访问参数列表,还可以访问对象的字段.也就是说,方法/函数关闭字段.这与关闭范围中的变量的"裸"函数(即,不是对象方法)没有什么不同.但是,对象语法提供了一个很好的抽象和模块化机制.
例如,我可以写
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)
合理?
| 归档时间: |
|
| 查看次数: |
1124 次 |
| 最近记录: |