В 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
сталкивается с "висящим" локальным блоком. Я что-то упустил?