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

Зачем использовать пустые круглые скобки в Scala, если мы просто не можем использовать круглые скобки для определения функции, которая не нуждается в каких-либо аргументах?

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

4b9b3361

Ответ 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() в других просмотренных областей, если, возможно, не повезло, по крайней мере было бы очень менее неожиданным.