在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)
,则会使用scalac
。
我考虑过它并且找不到需要“悬空”本地块(即,其值不使用的本地块)的情况(或使代码更优雅)。
是否存在需要本地块而不使用其值(并且不将其放在不同的函数中并调用此函数)的情况?我很乐意举个例子。
如果没有,我认为每当{{1}}遇到“悬空”本地区块时发出警告(甚至禁止altogther)会很好。我错过了什么吗?
答案 0 :(得分:5)
为什么不写
new Iterator[Int] {
...
}
修改强>: 这是Scala中编程使用的样式(请参阅sample chapter pdf)
new RationalTrait {
val numerArg = 1 * x
val denomArg = 2 * x
}
打开大括号“{”出现在与声明语句相同的行的末尾
答案 1 :(得分:3)
{
import my.crazy.implicit.functions._
// use them...
}
// code I know isn't touched by them.