Подтвердить что ты не робот

Почему и когда мне нужно следовать имени метода с помощью _?

Я немного неуверен в правилах относительно того, когда вам нужен _ после использования метода в качестве функции. Например, почему существует разница между 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>)
4b9b3361

Ответ 1

Когда вы опускаете все параметры в частично примененном выражении функции, вам нужно следовать ему с помощью _, если компилятор не требует типа функции в том месте, где вы его используете.

Когда вы вызываете метод :: на Foo, компилятор ожидает тип Int => Int для параметра. Таким образом, вы можете спокойно опустить подчеркивание после square в этой позиции.

Однако метод :: на Nil может принимать параметр любого типа. Поэтому вместо того, чтобы предполагать, что вы хотите частично применить эту функцию, она жалуется, если вы не сделаете ее абсолютно явной, добавив _.

Итак, это правила... Я не могу действительно просветить вас о том, почему это правила; может быть, кто-то другой, кто лучше знает компилятор, систему типов и дизайн языка, сможет рассказать вам, почему. Но я полагаю, что без этих правил во многих местах была бы опасность случайной двусмысленности.