"болтающиеся" местные блоки в скале - PullRequest
2 голосов
/ 06 октября 2009

В Scala можно определить локальный блок в функции. Локальный блок оценивает последние операторы, например,

val x = {val x =1;x+1}

Здесь x==2, внутренний val x является локальным для этого блока.

Однако эти локальные блоки могут вызывать скрытые ошибки при написании анонимных классов. Например (из справочника Скалы)

new Iterator[Int]
{...} // new anonymous class inheriting from Iterator[Int]

new Iterator[Int]

{...} //new Iterator[Int] followed by a "dangling" local block

Различение между этими двумя случаями разочаровывает. Иногда эти два фрагмента кода можно скомпилировать, например, если вместо Iterator[Int] используется Range(0,1,1).

Я подумала об этом и не смогла найти случай, когда нужен «висячий» локальный блок (т. Е. Локальный блок, значение которого не используется) (или делает код более элегантным).

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

Если нет, я думаю, было бы неплохо выдать предупреждение (или даже запретить вообще) всякий раз, когда scalac сталкивается с "висящим" локальным блоком. Я что-то упустил?

Ответы [ 2 ]

5 голосов
/ 06 октября 2009

Почему бы не написать

new Iterator[Int] {
  ...
}

Редактировать : Этот стиль используется при программировании в Scala (см. пример главы pdf )

new RationalTrait {
  val numerArg = 1 * x
  val denomArg = 2 * x
}

и Соглашения о кодировании Java .

Открывающая скобка "{" появляется в конце той же строки, что и оператор объявления

3 голосов
/ 08 октября 2009
  {
    import my.crazy.implicit.functions._

    // use them...
  }

  // code I know isn't touched by them.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...