在Scala中,我如何明确引用封闭的局部范围?

时间:2013-10-21 02:50:44

标签: scala variables scope

这对我来说是个常见的烦恼:

trait Foo {
    val x: Int
}

def foo(x: Int) = new Foo {
    val x = x // <-- Here
}

在编写Scala时,我可能每20分钟遇到一次。

我所知道的解决方案及其各自的缺陷是:

  • 将本地声明包含在可以命名的对象中 - 对参数不起作用。
  • 创建别名 - 如果您需要保留路径依赖类型,则为详细。
  • 使用代理构造函数 - 在依赖类型字段存在的情况下很麻烦。

还有其他人吗?

2 个答案:

答案 0 :(得分:2)

我有时会使用这种俗气的方法:

def foo(x: Int): Foo = {
  val x1 = x
  new Foo {
    val x = x1
  }
}

答案 1 :(得分:1)

这个怎么样?

trait Foo {
    val x: Int
}

object Foo {
    def apply(xt: Int) = new Foo { val x = xt }
}

def foo(xt: Int) = Foo(xt) // <-- Here