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

时间:2015-07-05 11:23:10

标签: scala methods alias anonymous-function

假设我想为方法创建一个别名:

def foo = bar(_)

这将警告

  

匿名函数可转换为方法值

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

def foo = bar

我收到错误

  

缺少方法栏的参数(a:A)

     

无法解析具有此类签名的参考栏。

2 个答案:

答案 0 :(得分:7)

首先,如果你想创建一个"别名"对于方法,这还不够:

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)。你不能&#39;只需指定方法(编译时实体),因为编译器会期望参数 - 您需要先将其转换为函数(使用下划线)。有时,当编译器需要一个函数时,它会自动完成:

scala> val foo: Int => Int = bar
foo: Int => Int = <function1>

所以这可能是Idea想要你的。在其他情况下 - 您必须明确使用eta-expansion运算符(_)。

P.S / 1。 def foo = bar(_)def代替val)毫无意义,因为每次都会返回新的(但相同的)函数,val(或lazy val是安全的来自NullPointerException)只返回一次。

P.S / 2。 difference between (_)_首先是部分应用的功能(自动执行_ eta-expansion),这意味着让我们说:< / p>

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

答案 1 :(得分:2)

这是IntelliJ的建议。如果您点击&#34;更多&#34;在建议中,您会看到以下内容(对不起它的图片,我无法复制文字):

enter image description here

您可以忽略或使用bar _代替bar(_)