2015-04-30 3 views
3

Ниже, как мы определяем функция ScalaВ Scala нам нужно «=» при определении метода?

def printName() : Any = { println ("vikrant") } 
def printName() : Unit = { println ("vikrant") } 

Является ли «=» просто синтаксис или у него есть цель? Просить это потому, что я имею право пропустить это, когда я не упоминаю типа возвращаемого, как следующий

def printName() { println ("vikrant") }  
+0

'=' необходимо только тогда, когда вам нужно вернуть значение. – tuxdna

ответ

6

Если метод возвращает Unit, вы можете опустить = (известное как процедуры синтаксиса), но это очень обескуражен (он устарел и даже обсуждался до remove it). От the style guide in the docs:

методы должны быть объявлены в соответствии со следующей схемой:

def foo(bar: Baz): Bin = expr 

Процедура Синтаксис: Избегайте синтаксис процедуры, как правило, сбивает с толку очень мало выгоды в краткости.

// don't do this 
def printBar(bar: Baz) { 
    println(bar) 
} 
// write this instead 
def printBar(bar: Bar): Unit = { 
    println(bar) 
} 

Там нет никакой разницы в сгенерированный байт-код. Это просто синтаксический сахар. Смотрите раздел 4.6.3 из the Scala specification, где он говорит:

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

Поэтому он скомпилирован по тому же коду. Эта функция имеет предупреждение, связанное с этим, если вы используете опцию -Xfuture:

Предупреждение: синтаксис процедуры устарел. Преобразуйте процедуру foo в метод, добавив : Unit =.

В Scala каждый метод возвращает значение (в отличие от других языков, которые имеют методы void и ничего не возвращают). Методы void на других языках часто возвращают Unit в Scala (например, ваш пример printName).

Вы можете объявить о любом способе как возвращение Unit, независимо от значения выражения после =. Это языковая функция, известная как значение, отбрасывающее, подробнее here.

+0

Спасибо за ваш ответ. Я действительно хочу понять, что это делает разницу в байт-коде, который мы получаем, если мы пропустим «=»? Если это не так ... тогда это хорошая практика ... но и церемония для многих других. – vikrant

+1

Я добавил немного больше, чтобы решить эту проблему, но нет - это не должно меняться. –

+1

@ Vikrant У меня были компиляторы, жалующиеся, если я опускаю знак равенства. Даже если это не влияет на выполнение кода, кажется, что язык предпочитает использовать знак равенства. – Carcigenicate

-2

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

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

+0

не согласен с тем, что фигурные скобки обязательно необходимы. Тривиальное, например: «val xPlus1Squared = {val xPlus1 = x +1; xPlus1 * xPlus1} ' – TooTone

+0

@TooTone Истинно, если вам нужно привязать переменную в какой-либо другой функции оператора, вам нужно будет использовать фигурные скобки. Это еще 2 заявления, выполняемые 1 за другим, хотя, даже если вы намерены создать функциональную функцию. Еще один результат смешивания двух разных типов языков. В идеале, чтобы перейти в полнофункциональный стиль, у нас были бы привязки 'where' /' let', но по какой-то причине они не были включены. Вероятно, потому что две функции-утверждения выполняют задание – Carcigenicate

Смежные вопросы