Scala IDE 警告:"anonymous function convertible to method value"
Scala IDE warning: "anonymous function convertible to method value"
假设我想为方法创建一个别名:
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.
首先,如果你想创建一个"alias" for 方法,这就足够了:
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
)没有任何意义,因为它每次都会 return 新的(但相同的)功能,val
(或 lazy val
为了安全起见 NullPointerException
) 只需 return 一次。
P.S/2。 (_)
和 _
是第一个部分应用的函数(自动执行 _
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) => bar(x))
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(_, _)
因为有两个参数。
这是 IntelliJ 的建议。如果您在建议中单击 "More",您将看到以下内容(抱歉,这是图形,我无法复制文本):
您可以忽略或使用 bar _
而不是 bar(_)
。
假设我想为方法创建一个别名:
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.
首先,如果你想创建一个"alias" for 方法,这就足够了:
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
)没有任何意义,因为它每次都会 return 新的(但相同的)功能,val
(或 lazy val
为了安全起见 NullPointerException
) 只需 return 一次。
P.S/2。 (_)
和 _
是第一个部分应用的函数(自动执行 _
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) => bar(x))
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(_, _)
因为有两个参数。
这是 IntelliJ 的建议。如果您在建议中单击 "More",您将看到以下内容(抱歉,这是图形,我无法复制文本):
您可以忽略或使用 bar _
而不是 bar(_)
。