1

我试图深入了解 Joshua Suareth 的书 Scala 中第 93 页上关于绑定优先级的第四条规则。

根据这个规则:

由不在定义出现的源文件中的包子句提供的定义具有最低优先级。

我打算测试的正是这条规则。

所以我开始尝试遵循 Josh 在第 94 页上的思路。他创建了一个名为 externalbindings.scala 的源文件,我也做了同样的事情,对其进行了一些更改,如下所示

package com.att.scala

class extbindings {
  def showX(x: Int): Int = {
    x
  }

  object x1 {
    override def toString = "Externally bound obj object in com.att.scala"
  }
}

接下来,他要求我们创建另一个文件,以便我们测试上述规则。我创建了一个名为 priority.scala 的文件:

package com.att.scala

class PrecedenceTest { //Josh has an object here instead of a class

  def testPrecedence(): Unit = { //Josh has main method instead of this
    testSamePackage()
    //testWildCardImport()
    //testExplicitImport()
    //testInlineDefinition()
  }

  println("First statement of Constructor")
  testPrecedence
  println("Last statement of Constructor")

  def testSamePackage() {
    val ext1 = new extbindings()
    val x = ext1.showX(100)
    println("x is "+x)
    println(obj1) // Eclipse complains here
  }
}

<package-name>.<object-name>.testSamePackage现在,Josh 只需在 REPL 上执行该方法即可打印出示例中对象的值。他的输出是:

包测试中的外部绑定 x 对象

在我的版本中,文件位于 Eclipse 中,并且我有嵌入式 Scala 解释器。

Eclipse 在这里抱怨:println(obj),它说:not found value obj1

我在设置测试文件时做错了什么吗?我希望能够测试我上面提到的规则并获得输出:

com.att.scala 包中的外部绑定 obj 对象

4

2 回答 2

4

我没有读过这本书,因此我不确定你的代码是否显示了这本书想要告诉你的内容。

尽管如此,错误消息是正确的。obj1找不到,因为它不存在。在您的代码中,它被称为x1. 因为它是您的成员,所以extbindings您必须以此类成员的身份访问它:

println(ext1.x1)

如果x1定义在 class 之外extbinding,在 package 范围内com.att.scala,你可以直接访问它:

println(x1)

如果它是在另一个包中定义的,则必须将包名放在前面:

println(com.att.scala2.x1)

为了简化一些你可以导入的东西x1

import ext1.x1
println(x1)

最后是改进代码的提示:名称类型在UpperCamelCase: extbindings-> Extbindings, x1->X1

于 2012-07-25T15:52:44.393 回答
3

如果用类替换单例对象,则需要创建该类的实例。

于 2012-07-25T15:56:26.607 回答