【问题标题】:Scala: How to access a shadowed function variable from an objectScala:如何从对象访问阴影函数变量
【发布时间】:2015-04-18 03:53:48
【问题描述】:

我想做以下工作:

def foo(x:Int = 1) = {
  object obj {
    val x = foo.this.x
  }
}

但我不知道如何从对象中引用 x。这可以在不重命名两个位置之一的 x 的情况下完成吗?

重命名变量可能并不容易,例如,foo 是一个广泛使用的 API 函数,其中 x 作为命名变量,而 obj 扩展了以 x 作为抽象成员的第 3 方特征。

【问题讨论】:

    标签: function scala object shadowing


    【解决方案1】:

    不,这是不可能的。无法识别函数定义的外部块。

    要使您的语法正常工作,foo 必须是具有成员 x 的对象。即这有效:

    class foo{
      val x = 1
      object obj {
        val x = foo.this.x
      }
    }
    

    foo 也可以是扩展 FunctionX 的单例对象,它为您提供非常类似于方法的东西。但重命名其中一个值可能更容易。

    【讨论】:

    • FunctionX 很有趣。也许我可以使用this SO answer中的方法将foo作为对象访问
    【解决方案2】:

    这在 Scala 中是不可能的。

    您编写代码,因此最简单的选择是重命名xs 之一并解决问题。

    但是,如果出于某种原因你真的需要它 - 你可以做一个技巧并创建一个 object ,它的行为就像你的方法

    object Foo {
      self =>
    
      val x = 1
    
      def apply() = {
        object obj {
          val x1 = self.x
          val x2 = Foo.x
          // x1 == x2, just 2 different ways of doing this
        }
      }
    }
    

    由于实现了apply 方法,您可以像使用函数Foo() 一样使用它

    【讨论】:

      【解决方案3】:

      为什么不直接引入一个与foo 的参数x 具有相同值但没有阴影的新变量?

      def foo(x: Int): Unit = {
        val foo_x = x
        object obj {
          val x = 13
          def doStuff: Unit = printf("%d %d\n", x, foo_x);
        }
        obj.doStuff
      }
      
      foo(42)
      

      【讨论】:

      • 是的,这是可行的,也是我目前所做的。这是可以接受的,但有点 hacky(我觉得它需要一个评论来解释 foo_x 的用途)。我对这个问题的希望是避免它。
      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2016-03-04
      相关资源
      最近更新 更多