如何引用外部作用域中的变量

时间:2017-05-16 10:26:54

标签: scala

如果我有以下代码:

trait MyTrait {
    val x: Int
}

def f(_x: Int) = new MyTrait {
    val x = _x
}

如果我按如下方式定义我的功能:

def f(x: Int) = new MyTrait {
    val x = x
}

这是不正确的,因为val x只是指自己。有没有办法可以避免为' x'使用不同的名称?当我想引用外部范围内的东西时?

3 个答案:

答案 0 :(得分:3)

不是真的:在MyTrait的范围内,x指的是该字段。但是,您可以选择在输入该范围之前将参数包装为其他名称:

def f(x: Int) = {
  val xn = x
  new MyTrait {
    val x = xn
  }
}

答案 1 :(得分:2)

您可以,但前提是外部范围x是封闭类型的成员,而不是方法参数或局部变量:

class MyOuter(val x: Int) {
  def f() = new MyTrait {
    val x = MyOuter.this.x
}

答案 2 :(得分:0)

嗯,在这种特殊情况下,你可以这样写:

 def f(x: Int) = {
    class Foo(val x: Int = x) extends MyTrait
    new Foo
  }

不确定仅仅将x重命名为y会更好...