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

问题描述 投票:7回答:2

假设我要为方法创建别名:

def foo = bar(_)

这会警告

可转换为方法值的匿名函数

而且我不太清楚这意味着什么,因为当我尝试尝试时,我认为这可能意味着:

def foo = bar

我收到错误

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

无法解析具有这种签名的参考栏。

scala methods alias anonymous-function
2个回答
8
投票

首先,如果要为方法创建“别名”,就足够了:

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扩展)。您不能仅指定方法(编译时实体),因为编译器需要参数-您需要首先将其转换为函数(使用下划线)。有时,当编译器需要函数时,它会自动完成:

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

所以这可能是Idea想要您提供的。在其他情况下-您必须显式使用eta扩展运算符(_)。

P.S / 1。 def foo = bar(_)(用def代替val)没有意义,因为每次都会返回新的(但相同的)函数,val(或从lazy val安全的NullPointerException)仅返回一次。

P.S / 2。difference between(_)_首先是部分应用的功能(它会自动执行_ eta扩展),这意味着我们可以说:

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


3
投票

这是IntelliJ的建议。如果在建议中单击“更多”,您将看到以下内容(很抱歉,它是图形,我无法复制文本):

“在此处输入图像描述”

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

© www.soinside.com 2019 - 2024. All rights reserved.