Scala методы без аргументов - программирование
Подтвердить что ты не робот

Scala методы без аргументов

В Scala существует два способа определения метода, который не принимает аргумент

    1 def a=println("hello")

    2 def a()=println("hello")

Эти два метода точно такие же, но (2) можно вызвать с круглыми скобками и без них.

Есть ли какая-либо особая причина, по которой эта функция разрешена в Scala. Она меня смущает, что использовать и когда?

4b9b3361

Ответ 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") }

Оба вышеупомянутых стиля делают рефакторинг более безопасным, потому что изменение тела метода никогда не заставит компилятор вывести другой тип возврата. ИМО это объяснение декларации более важно, чем стиль кода сайта.