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

Scala IDE警告:“匿名函数可转换为方法值”

发布时间:2020-12-16 09:50:56 所属栏目:安全 来源:网络整理
导读:假设我想为方法创建一个别名: def foo = bar(_) 这将警告 Anonymous function convertible to a method value 而且我不太确定这是什么意思,因为当我尝试我认为这可能意味着什么时: def foo = bar 我收到一个错误 Missing arguments for method bar(a:A) Ca
假设我想为方法创建一个别名:

def foo = bar(_)

这将警告

Anonymous function convertible to a method value

而且我不太确定这是什么意思,因为当我尝试我认为这可能意味着什么时:

def foo = bar

我收到一个错误

Missing arguments for method bar(a:A)

Cannot resolve reference bar with such signature.

解决方法

首先,如果你想为方法创建一个“别名”,那就足够了:

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(_,_),因为有两个参数.

(编辑:李大同)

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

    推荐文章
      热点阅读