なぜ、いつ_私はメソッド名の後にする必要がありますか?
-
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