Scala IDE警告:“匿名函数可转换为方法值”
假设我想为方法创建一个别名:
def foo = bar(_) 这将警告
而且我不太确定这是什么意思,因为当我尝试我认为这可能意味着什么时: def foo = bar 我收到一个错误
解决方法
首先,如果你想为方法创建一个“别名”,那就足够了:
scala> val foo = bar(_) //val instead of def,still warning from Idea foo: Int => Int = <function1> 其次,这应该删除Idea的警告: scala> val foo = bar _ foo: Int => Int 实际上,它不仅仅是别名 – 你的方法变成了function(eta-expansion).你不能只指定方法(编译时实体),因为编译器会期望参数 – 你需要先将它转换为一个函数(使用下划线).有时它在编译器需要函数时自动完成: scala> val foo: Int => Int = bar foo: Int => Int = <function1> 所以这可能是Idea想要你的.在其他情况下 – 您必须明确使用eta-expansion运算符(_). P.S / 1. def foo = bar(_)(def而不是val)没有任何意义,因为它每次都会返回新的(但是相同的)函数,val(或者从NullPointerException安全的lazy val)只返回一次. P.S / 2. difference between(_)和_是第一个部分应用的函数(它自动进行_tata扩展),这意味着让我们说: scala> def bar(a: Int,b: Int) = a bar: (a: Int,b: Int)Int scala> def foo = bar _ foo: (Int,Int) => Int scala> def foo = bar(_) <console>:8: error: missing parameter type for expanded function ((x$1) => bar(x$1)) def foo = bar(_) ^ <console>:8: error: not enough arguments for method bar: (a: Int,b: Int)Int. Unspecified value parameter b. def foo = bar(_) ^ scala> def foo = bar(_,_) foo: (Int,Int) => Int 你必须指定bar(_,_),因为有两个参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- scala – 使用Slick为java.time.LocalDate创建自
- layout – 在vim中添加行之间的垂直空间
- scala – 如何在使用数据帧时下推限制Cassandra的
- bash – “黑客”一个5个字符的远程shell的方式
- Axis2 POJO WebService 测试
- 关于footable不自动分页及不自动刷新页面样式问题
- anglejs – 量角器E2E角“无法在窗口上找到”
- angularjs – angular-socket-io io未定义
- 云计算 – Cloudify:bootstrap-localcloud:操作
- 选择性地禁用Scala中的包含? (正确输入List.con