"оборванные" локальные блоки в scala

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

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

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

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

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).

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

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

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

Ответы

Ответ 1

  {
    import my.crazy.implicit.functions._

    // use them...
  }

  // code I know isn't touched by them.

Ответ 2

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

new Iterator[Int] {
  ...
}

Edit: Это стиль, используемый Программой в Scala (см. образец главы pdf)

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

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

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