为什么当我需要遵循的方法名称以_?
-
20-09-2019 - |
题
我在的规则,当你需要一个_
的方法后,使用它作为一个功能有点不稳。例如,为什么会出现Foo
的和Nil
在下面::
之间的差异?
def square(n: Int) = n * n
object Foo { def ::(f: Int => Int) = f(42) }
// ...
scala> Foo.::(square)
res2: Int = 1764
scala> Nil.::(square)
<console>:6: error: missing arguments for method square in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
Nil.::(square)
^
scala> Nil.::(square _)
res3: List[(Int) => Int] = List(<function1>)
解决方案
当省略在部分应用函数表达式的所有的参数,那么就需要用_
跟随它,除非编译器的需要在使用位置的函数式它
在呼吁::
方法Foo
,编译器期望该参数的类型Int => Int
。所以,你可以放心地忽略在那个位置square
后下划线。
然而,在::
的Nil
方法可以采取任何类型的参数。因此,而不是假设你的意思是部分应用功能,它抱怨,除非你让它完全明确加入_
。
因此,这些都是规则的......我真的不能启发你约的为什么的那些规则;也许别人谁拥有编译器,类型系统和语言设计的更好的知识就能告诉你为什么。但我相信,如果没有这些规则,就不会有意外的模糊性,在许多地方的危险。
不隶属于 StackOverflow