Ответ 1
{
import my.crazy.implicit.functions._
// use them...
}
// code I know isn't touched by them.
В 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
сталкивается с "болтающимся" локальным блоком. Я что-то пропустил?
{
import my.crazy.implicit.functions._
// use them...
}
// code I know isn't touched by them.
Почему бы не написать
new Iterator[Int] {
...
}
Edit: Это стиль, используемый Программой в Scala (см. образец главы pdf)
new RationalTrait {
val numerArg = 1 * x
val denomArg = 2 * x
}
и Соглашения о кодировании Java.
Открытая скобка "{" появляется в конце той же строки, что и оператор объявления