Коли використовувати знак рівності в декларації методу Scala?


85

Зі знаком рівності:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

Без знака рівності:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

Обидві вищезазначені програми виконуються однаково. У дописі в блозі Те, що мені не подобається в Scala, я читав, що коли знак рівності відсутній, метод повернеться Unit(те саме, що і Java void), тому методи, які повертають значення, повинні використовувати знак рівності. Але методи, які не повертають значення, можна записати в будь-якому випадку.

Яка найкраща практика використання знака рівності в методах Scala, які не повертають значення?

Відповіді:


108

Я насправді досить сильно не погоджуюся з Даніелем. Я думаю, що нерівний синтаксис ніколи не слід використовувати. Якщо ваш метод виставляється як API і вас турбує випадкове повернення неправильного типу, додайте явну анотацію типу:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

Нерівний синтаксис коротший і може виглядати «чистішим», але я думаю, що це просто додає можливість плутанини. Я іноді забуваю додати знак рівності і вважаю, що мій метод повертає значення, коли насправді він повертає Unit. Оскільки синтаксиси нерівного та рівного виведеного типу настільки візуально схожі, легко пропустити цю проблему.

Незважаючи на те, що це коштує мені трохи більше роботи, я віддаю перевагу явним анотаціям типів, коли вони мають значення (а саме відкриті інтерфейси).


1
Мені подобається такий підхід, він є більш чітким і, отже, більш зрозумілим для читача.
Лукаш Коржибський

4
Очевидно, це зараз рекомендований стиль ( docs.scala-lang.org/style/declarations.html#procedure_syntax ), тому я змінюю це як прийняту відповідь.
Еско Луонтола

1
Я також з цим згоден, я думаю, що синтаксис без = слід взагалі видалити з мови
Ахмед Соліман Фаргал

7
Мартін Одерський у своєму ключовому доповіді "Скала зі стилем" сказав, що це історична помилка. Йому довелося додати цей синтаксис (без =), щоб він міг приховати "Unit" від розробників Java, щоб вони не заплуталися. Також він зазначив, що його буде вилучено в майбутньому.
tabdulradi

2
Чи є спосіб ПОПЕРЕДЖИТИ, якщо знак рівності був забутий у визначенні методу? Наприклад, як варіант компілятора чи як інструмент аналізу джерел?
ВасильНовіков

42

ОНОВЛЕННЯ: станом на Scala-2.10 переважно використовувати знак рівності. Стара відповідь:

Методи, які повертають, завждиUnit повинні використовувати нерівний синтаксис. Це дозволяє уникнути потенційних помилок при перенесенні реалізації на API. Наприклад, ви могли випадково зробити щось подібне:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

Звичайно, тривіальний приклад, але ви бачите, як це може бути проблемою. Оскільки останній вираз не повертається Unit, сам метод матиме тип повернення, відмінний від Unit. Це висвітлюється в загальнодоступному API та може спричинити інші проблеми. З нерівним синтаксисом неважливо, яким є останній вираз, Scala фіксує тип повернення як Unit.

Це також прибиральник на два символи. :-) Я також схильний думати, що нерівний синтаксис полегшує читання коду. Більш очевидно, що розглянутий метод повертає, Unitа не якесь корисне значення.

У відповідній примітці є аналогічний синтаксис абстрактних методів:

trait Foo {
  def bar(s: String)
}

Метод barмає підпис String=>Unit. Scala робить це, коли ви опускаєте анотацію типу для абстрактного члена. Знову ж таки, це чистіше та (я думаю) легше читати.


3
Не використовувати знак рівності - це також рекомендація в Посібнику зі стилю Scala: davetron5000.github.com/scala-style/types/inference/…
Еско Луонтола

6
Я написав цей фрагмент, тому, мабуть, ви повинні це пам’ятати, коли зважуєте посилання. :-)
Даніель Шпівак

LoL, тому я описав цей маленький обмін зі своєю дівчиною, за винятком мого поганого висловлювання "bit" вийшов як "bitch". Що й казати, виникла комедія.
Саем

10
ScalaDays 2013, Мартін Одерський, Keynote - Scala with Style, глава 45 : слід уникати декларування процедур (не-рівний синтаксис).
senia

4
Офіційний посібник зі стилю більше цього не рекомендує: docs.scala-lang.org/style/declarations.html#procedure_syntax
sbilstein

12

Ви повинні використовувати знак рівності в деклараціях викликів, крім визначень, що повертають Unit.

В останньому випадку ви можете відмовитись від знака рівності. Однак цей синтаксис може бути застарілим, тому його краще уникати. Використання знака рівності та оголошення типу повернення спрацює завжди.


Книги, список розсилки, вихідний код. До речі, з того часу стало зрозуміло, що останній синтаксис навряд чи буде застарілим, і його підтримують багато.
Daniel C. Sobral

1
docs.scala-lang.org/style/types.html#function_values Схоже на те, що керівництво стилем типів в будь-якому випадку вказує весь час =.
BeepDog

4

Для методів Scala Style Guide рекомендує рівний синтаксис на відміну від синтаксису процедури

Синтаксис процедури

Уникайте синтаксису процедури, оскільки він, як правило, заплутаний для дуже невеликого виграшу в стислості.

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

0

Одне: уявіть, останнє твердження методу, який повинен повернути Unit, не повертає Unit. Тоді використовувати нерівний синтаксис дуже зручно, сподіваюся, це не буде застарілим, оскільки я бачу кілька варіантів використання для нього


0

По мірі того, як із часом стиль за замовчуванням змінювався, і це було згадано в багатьох коментарях до відповідей, в офіційному посібнику стилів рекомендується використовувати =синтаксис для оголошень функцій.


1
Посилання, яке ви надали, говорить лише про функції, а не про процедури (тобто функції, які повертають Unit).
Еско Луонтола

Ви маєте рацію, @EskoLuontola, Вибачте за це, я, мабуть, скопіював неправильне посилання з однієї з багатьох відкритих у мене вкладок, воно оновилось.
BeepDog

0

для методу, який не має поверненого значення, способом вираження таких методів є залишення типу результату та знака рівності, слідуючи методу з блоком, укладеним у фігурні дужки. У цій формі метод виглядає як процедура, метод, який виконується лише для побічних ефектів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.