Я немного шаток на правилах относительно того, когда Вам нужен a _
после метода для использования его в качестве функции. Например, почему там различие между 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>)
Dim aDate As DateTime = #3/1/2008# 'sample date
Dim StartDate As DateTime = aDate.AddMonths(-1).AddDays(-(aDate.Day - 1))
Dim EndDate As DateTime = StartDate.AddDays(DateTime.DaysInMonth(StartDate.Year, StartDate.Month) - 1)
'to access just the date portion
' StartDate.Date
' EndDate.Date
-121--2091515- Превосходное руководство Subversion manual доступно бесплатно.
-121--3030618- При пропуске всех параметров в частично примененном выражении функции необходимо следовать за ним с помощью _
, если компилятору не требуется тип функции в месте ее использования.
При вызове метода ::
в Foo
компилятор ожидает для параметра тип Int = > Int
. Таким образом, вы можете безопасно опустить подчеркивание после квадрат
в этой позиции.
Однако метод ::
в Nil
может принимать параметр любого типа. Поэтому вместо того, чтобы предполагать, что вы хотели частично применить функцию, он жалуется, если вы не сделать его абсолютно явным, добавив _
.
Итак, таковы правила... Я не могу на самом деле просветить вас о почему таковы правила; может быть, кто-то еще, кто лучше знает компилятор, систему типов и дизайн языка, сможет сказать вам почему. Но я предполагаю, что без этих правил во многих местах была бы опасность случайной двусмысленности.