Насколько я понимаю, в Scala мы можем определить функцию без параметров либо с помощью пустых круглых скобок после ее имени, либо без скобок, и эти два определения не являются синонимами. Какова цель различения этих двух синтаксисов и когда лучше использовать их вместо другого?
Зачем использовать пустые круглые скобки в Scala, если мы просто не можем использовать круглые скобки для определения функции, которая не нуждается в каких-либо аргументах?
Ответ 1
В основном это вопрос конвенции. Методы с пустыми списками параметров, по соглашению, оцениваются по их побочным эффектам. Методы без параметров считаются свободными от побочных эффектов. Это соглашение.
Ответ 2
Scala Руководство по стилю говорит о том, чтобы опустить скобки только тогда, когда вызываемый метод не имеет побочных эффектов: http://docs.scala-lang.org/style/method-invocation.html
Ответ 3
Другие ответы велики, но я также думаю, что стоит упомянуть, что методы no-param допускают хороший доступ к полям классов, например:
person.name
Из-за беспараметрических методов вы можете легко написать метод перехвата чтения (или записи) в поле "имя" без нарушения кода вызова, например
def name = { log("Accessing name!"); _name }
Это называется Uniform Access Principal
Ответ 4
У меня есть еще один свет, чтобы привести к полезности конвенции, поощряющей пустой блок круглых скобок при объявлении функций (и, следовательно, позже в их вызовах) с побочными эффектами.
Это с отладчиком.
Если вы добавите часы в отладчик, например, process
, ссылаясь на пример на логическое в контексте сфокусированного отладки, либо в виде переменной, либо как на бесплатную оценку свободных побочных эффектов, это создает неприятный риск для вашего последующего устранения неполадок.
В самом деле, если отладчик держит это наблюдение как вещь для оценки, когда вы меняете контекст (смените поток, перейдите в стек вызовов, достигнете другой точки останова...), который, по моему мнению, был, по крайней мере, с IntelliJ IDEA или Visual Studio для других языков, тогда будут активированы побочные эффекты любой другой функции process
, возможно, найденной в любой просматриваемой области...
Представьте себе, какое непонятное устранение неполадок может привести к тому, что у вас нет такого предупреждения, поскольку это связано с невинным обычным названием. Если бы соглашение было применено, в моем примере логическая оценка process
никогда не вернется к вызову функции process()
в часах отладчика; в вашем отладчике может быть разрешено явно обращаться к функции(), помещая process()
в часы, но тогда было бы ясно, что вы не получаете прямого доступа к каким-либо атрибутам или локальным переменным и не возвращаетесь к другим функциям process()
в других просмотренных областей, если, возможно, не повезло, по крайней мере было бы очень менее неожиданным.