微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

维基百科上的Scala关闭

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)

纠正我,如果我错了,但这不是关闭?它是一个函数文字,一个无常的函数,一个lambda函数,但不是一个闭包?

解决方法

好吧,如果你想成为技术,这是一个函数文字,它在运行时被翻译成一个闭包,关闭开放术语(将它们绑定到函数文字的范围内的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上运行的代码编译.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐