Scala методы без аргументов
В Scala существует два способа определения метода, который не принимает аргумент
1 def a=println("hello")
2 def a()=println("hello")
Эти два метода точно такие же, но (2) можно вызвать с круглыми скобками и без них.
Есть ли какая-либо особая причина, по которой эта функция разрешена в Scala. Она меня смущает, что использовать и когда?
Ответы
Ответ 1
Общее правило заключается в том, что вы должны добавить пустой список параметров как на сайт объявления, так и на сайт вызова, когда метод (не функция) имеет побочные эффекты.
В противном случае Scala имеет принцип равномерного доступа, поэтому клиентам не нужно знать, обращаются ли они к полю или вызывают метод без побочных эффектов.
Ответ 2
Синтаксис без круглых скобок разрешен, поэтому можно написать это:
abstract class X {
def f: Int
}
class Y extends X {
val f = 0
}
Код, вызывающий f
на X
, не должен знать, является ли это val
или def
.
Причина, по которой можно опустить скобки при вызове методов с пустым списком, - это разрешить вызов методов Java, которые в идеале не имеют круглых скобок (но поскольку они являются Java, все они имеют скобки).
Как и все сказанное, существует соглашение об использовании пустого списка параметров, когда метод имеет побочные эффекты, и в противном случае их исключить.
Ответ 3
Это вопрос стиля, если вы решите использовать круглые скобки для указания вызова метода побочных эффектов.
Кстати, если вы объявляете чисто побочный эффект с помощью =
, вы должны явно объявить возвращаемый тип Unit
, например:
def a: Unit = println("hello")
Обратите внимание, что любой тип может быть привязан к Unit
.
Если вы не хотите явно объявлять тип возврата, вы, вероятно, должны опустить =
. Затем компилятор выведет возвращаемый тип Unit
, даже если последнее выражение возвращает что-то другое:
def a() { println("hello") }
Оба вышеупомянутых стиля делают рефакторинг более безопасным, потому что изменение тела метода никогда не заставит компилятор вывести другой тип возврата. ИМО это объяснение декларации более важно, чем стиль кода сайта.