在
wikipedia上的
Closure页面上找到以下代码段
//# Return a list of all books with at least 'threshold' copies sold. def bestSellingBooks(threshold: Int) = bookList.filter(book => book.sales >= threshold) //# or def bestSellingBooks(threshold: Int) = bookList.filter(_.sales >= threshold)
解决方法
好吧,如果你想成为技术,这是一个函数文字,它在运行时被翻译成一个闭包,关闭开放术语(将它们绑定到函数文字的范围内的val / var).此外,在这个函数文字(_.sales> = threshold)的上下文中,threshold是一个自由变量,因为函数文字本身并没有给它任何意义.本身,_.sales> = threshold是一个开放术语在运行时,它每次调用函数时绑定到函数的局部变量.
def makeIncrementer(inc: Int): (Int => Int) = (x: Int) => x + inc
在运行时,以下代码生成3个闭包.还有趣的是,b和c不是相同的闭包(b == c给假).
val a = makeIncrementer(10) val b = makeIncrementer(20) val c = makeIncrementer(20)
我仍然认为在维基百科上给出的例子是一个很好的例子,尽管不完全覆盖整个故事.这是非常困难的,通过最严格的定义给出了实际关闭的一个例子,而实际上没有运行程序的内存转储.它与类对象关系是一样的.您通常通过定义一个类Foo {…然后使用val f = new Foo实例化它来表示对象的示例,说f是对象.
– Flaviu Cipcigan
笔记:
>参考:Scala中的编程,Martin Odersky,Lex Spoon,Bill venners>使用Scala版本2.7.5.final在Java 1.6.0_14上运行的代码编译.