Методы Scala без аргументов - PullRequest
17 голосов
/ 04 августа 2011

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

    1 def a=println("hello")

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

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

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

Ответы [ 3 ]

19 голосов
/ 04 августа 2011

Общее правило заключается в том, что вы должны добавлять пустой список параметров как на сайте декларации, так и на сайте вызова, когда у метода (не функции) есть побочные эффекты.

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

10 голосов
/ 04 августа 2011

Синтаксис без скобок разрешен, поэтому можно написать это:

abstract class X {
  def f: Int
}

class Y extends X {
  val f = 0
}

Код, вызывающий f для X, не должен знать, является ли он val или def.

Причина, по которой можно пропустить круглые скобки при вызове методов с пустым списком, состоит в том, чтобы разрешить вызов методов Java, которые в идеале не имеют круглых скобок (но, поскольку они являются Java, у них всех есть скобки).1010 *

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

7 голосов
/ 04 августа 2011

Это вопрос стиля, если вы решите использовать скобки для обозначения побочного вызова метода.

Кстати, если вы объявляете чисто побочный метод, используя =, вам, вероятно, следует явно объявить тип возвращаемого значения Unit, например:

def a: Unit = println("hello")

Обратите внимание, что любой тип может быть приведен к Unit.

Если вы не хотите явно объявлять тип возвращаемого значения, вам, вероятно, следует пропустить =. Затем компилятор выведет тип возврата Unit, даже если последнее выражение возвращает что-то другое:

def a() { println("hello") }

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

...