加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

维基百科上的Scala关闭

发布时间:2020-12-16 18:57:56 所属栏目:安全 来源:网络整理
导读:在 wikipedia上的 Closure页面上找到以下代码段 //# Return a list of all books with at least 'threshold' copies sold.def bestSellingBooks(threshold: Int) = bookList.filter(book = book.sales = threshold)//# ordef bestSellingBooks(threshold: In
在 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上运行的代码编译.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读