为什么方法体中的顶级val会影响Scala中的方法参数?

时间:2015-09-19 11:23:22

标签: scala namespaces

我刚刚发现了一个错误,它是通过自动重命名IntelliJ IDEA中的方法参数引入的。结果是,参数在方法体内被一个同名的本地val遮蔽,如下所示:

def foo(arg: Int): Int = {
  val arg = 1
  arg
}

assert(foo(2)) // fail

(更糟糕的是,由于我用来比较值的类型不安全==,编译器并没有引起怀疑。)

Scala是否允许通过方法体顶层的值隐藏方法参数?

编辑:还有一个编译器选项可以用来避免这些事情发生吗?

1 个答案:

答案 0 :(得分:0)

似乎函数参数被认为是来自更高级别的范围。

当然有点反直觉。但是,如果你写的有点不同,它可能会有点意义:

def foo = { (arg: Int) =>
  val arg = 1

  arg
}