scala 闭包问题
scala 的三个函数如下所示,正确调用三个函数返回的函数签名是一样的,但是不明白三个函数不同之处到底代表什么?
直观上看 f1 和 f3 都是不接受任何参数,但是使用上 f1 可以使用省略括号和使用空括号两种方式,f3 则不能使用空括号。f1 和 f3 两个函数有什么区别呢?这种区别是 scala 的特性呢还是bug呢?
f1 和 f2 函数体内返回 pp 函数的时候使用不使用 “_“ 都是返回了函数。不使用 "_" 也并没有当成函数调用去编译然后报错。请问这个该怎么理解呢?
def f1(): String => Unit = {
def pp(s: String): Unit = println(s)
pp
}
def f2(): String => Unit = {
def pp(s: String): Unit = println(s)
pp _
}
def f3: String => Unit = {
def pp(s: String): Unit = println(s)
pp
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先,要明确在 Scala 中如果一个方法不接受参数,那么可以不使用
()
调用它:等价于:
但是在定义函数时,方法是否有括号则很重要。对于楼主的函数:
编译器认为
f1
和f3
不等价。对于f1
我们可以不加括号调用它,也可以加上括号;但是f3
就一定不能加上括号。这是一个 feature 而不是 bug可以参考我的这篇文章:有括号方法和无括号方法区别。在结构类型(Structural Type)中,这两者定义是有区别的。再谈谈
f1
与f2
的区别。实际上f1
返回的函数是pp
而f2
返回的是一个匿名函数,这样匿名函数其实是:这就是
_
的作用。它实际上是一个占位符,表示接受一个参数。楼主也可以写成:回到楼主的例子中:
就等价于:
另外,这三个函数在我理解看来不是闭包哦。闭包可以理解为在函数中引用了函数外部的变量,
没人回答就自问自答吧。
_ 我感觉就是个包装器,类似于
就相当于
对于
val b = 4
使用val c = b _
也会使得c成为一个匿名函数,函数签名为()=>Int
但是具体的机制怎么样还没弄明白。。。
对于函数 f3,是关于
pp
的使用,pp 编译器怎么编译 pp 取决于 pp 出现的位置。pp 首先是一个对象,function1 之类的对象。有些地方会把 pp 当作函数调用,有些地方会把 pp 当作 函数对象。这两天写代码的一些感想,不严格。。。