前向参考扩展了值形状的定义

时间:2013-09-11 07:03:00

标签: scala reference

类似的问题1.2.提到了scala中前向引用的真正问题。 但我发现这个特殊的简单情况没有正向引用。所有街区都是完全独立的。

def testFunction() = {
  def recursiveMethod(i: Int, j: Int = 3): Unit = i match {
    case 0 => println(s"finished")
    case i => recursiveMethod(i-1)
  }
  val shapes = List[String]()
  def recursive(i: Int): Unit = i
}

解决目前发现的问题的解决方案:

  • shapes成为 lazy val (如2.中所述)
  • 将函数recursive重命名为不是前缀 recursiveMethod
  • 的内容
  • 删除可选参数 j:Int = 3
  • 没有recursiveMethod 自行调用

有人可以向我解释为什么这些是解决方案,虽然它们似乎与问题完全无关?

1 个答案:

答案 0 :(得分:5)

使用-Xprint:typer,您可以看到正向引用的合成:

package oops {
  object Test extends scala.AnyRef {
    def <init>(): oops.Test.type = {
      Test.super.<init>();
      ()
    };
    def testFunction(): Unit = {
      def recursiveMethod(i: Int, j: Int = 3): Unit = i match {
        case 0 => scala.this.Predef.println(scala.StringContext.apply("finished").s())
        case (i @ _) => recursiveMethod(i.-(1), recursiveMethod$default$2)
      };
      val shapes: List[String] = immutable.this.Nil;
      def recursive(i: Int): Unit = {
        i;
        ()
      };
      <synthetic> def recursiveMethod$default$2: Int @scala.annotation.unchecked.uncheckedVariance = 3;
      ()
    };
    def main(args: Array[String]): Unit = ()
  }
}

至少有一些与生成接近其原点的方法有关的门票可以避免这些无形的问题。

更新:对于prurient:

Oldie but goodie

Closer to my heart if not directly related to this problem

我特别喜欢“重命名函数,因此它不是其他函数的前缀”。

这显示重命名如何重新排序成员:

  abstract trait Oops extends scala.AnyRef {
    def /*Oops*/$init$(): Unit = {
      ()
    };
    def testFunction(): Unit = {
      def recursiveMethod(i: Int, j: Int = 3): Unit = i match {
        case 0 => scala.this.Predef.println(scala.StringContext.apply("finished").s())
        case (i @ _) => recursiveMethod(i.-(1), recursiveMethod$default$2)
      };
      <synthetic> def recursiveMethod$default$2: Int @scala.annotation.unchecked.uncheckedVariance = 3;
      val shapes: List[String] = immutable.this.Nil;
      def xrecursive(i: Int): Unit = {
        i;
        ()
      };
      ()
    }
  };

无需添加,这必须是错误或回归。正确?

更新

实际上,排序测试是syntName.toString.startsWith,这解释了为什么重命名其他功能会产生影响。这显示了多么脆弱的名称破坏漏洞到处都是漏洞。这就像有白蚁一样,经常从木制品中蹦出来,提醒你在过去的五年里,它们已经损害了框架的结构完整性。

这是带有评论[Martin] This is pretty ugly.的代码所以它不是未知的,只需要有空闲时间的人。