Если метод определен как
def toList = { /* something */ }
тогда оно должно называться
object.toList
без лишних скобок. Мы говорим, что этот метод имеет списки нулевых параметров .
Мы также можем определить список параметров, но ничего не помещать в него:
def toList() = { /* something */ }
Теперь мы можем позвонить любому из
object.toList()
object.toList
, поскольку Scala позволяет использовать ярлыки для опускания скобок при вызовах методов.
Что касается JVM, то нет разницы между первым определением («списки нулевых параметров») и вторым («один пустой список параметров»). Но Скала проводит различие. Является ли это хорошая идея или нет, это вопрос спорный, но мотивация может быть яснее, когда вы понимаете, что мы можем также
def toList()() = { /* something */ }
, который известен как два пустых списка параметров , а затем вызвать любой из
object.toList()()
object.toList()
object.toList
и теперь, если бы мы преобразовали это в функцию, мы напечатали бы это как
() => () => T /* T is the return value of the something */
в то время как второе определение будет
() => T
, что принципиально отличается концептуально, даже если вы используете его практически одинаково (ничего не вставляйте и рано или поздно вытащите T
).
В любом случае, toList
не нуждается в каких-либо параметрах, и стандарт Scala состоит в том, чтобы исключать паренсы, если только метод не изменяет сам объект (а не просто возвращает что-то), так что это def toList
без паренсов впоследствии. И, таким образом, вы можете назвать это только как object.toList
.