【问题标题】:Not able instantiate scala class in a package无法在包中实例化 scala 类
【发布时间】:2017-05-05 14:45:53
【问题描述】:

我有三个文件,一个是hi.scala,第二个是hic.scala,第三个是hello.scala。两者的代码如下:

hi.scala

package testpackage.src

package object hi {
    def abs(x: Double) = if (x>=0) x else -x

    def sqrt(x: Double) = {
        def sqrtIter(guess: Double, x: Double): Double =
            if(isGoodGuess(guess,x)) guess
            else sqrtIter(improve(guess,x),x)
        def isGoodGuess(guess: Double, x: Double) =
            abs(guess * guess - x)/x < .0001
        def improve(guess: Double, x: Double) = 
            (guess + x / guess)/2
        sqrtIter(1.0, x)
    }
}

hic.scala

package testpackage.src{

class hic {
    def abs(x: Double) = if (x>=0) x else -x

    def sqrt(x: Double) = {
        def sqrtIter(guess: Double, x: Double): Double =
            if(isGoodGuess(guess,x)) guess
            else sqrtIter(improve(guess,x),x)
        def isGoodGuess(guess: Double, x: Double) =
            abs(guess * guess - x)/x < .0001
        def improve(guess: Double, x: Double) = 
            (guess + x / guess)/2
        sqrtIter(1.0, x)
    }
}

}

你好.scala

import testpackage.src._

object hello {
    def main(args: Array[String]): Unit = {
        println(hi.sqrt(2)) //works fine
        println(hi.abs(-2)) //works fine
        println(new hic) //  error: not found: type hic
        println(new testpackage.src.hic) // error: type hic is not a member of package testpackage.src
    }
}

我能够访问 hi.scala 文件的 hi 对象的 sqrt 和 abs 方法,但我无法实例化 hic.scala 文件的 hic 类的对象。我无法理解为什么我无法在包中实例化类的对象。

更新:事实证明,代码中没有错误,而是在执行方法中。代码给出了以下常见错误(@ println(new hic)和println(new testpackage.src.hic)) -

scalac *.scala and scala hello.scala

但是,使用以下命令,代码运行良好 -

scalac *.scala and scala hello

【问题讨论】:

  • 这里似乎有些不对劲。如果不先实例化它,您当然不能从类中调用这些方法。你也有hi object 以及类吗?你提到new hi 给出一个错误 - 错误是什么?
  • 我已经更新了问题,有一个已编译的 .class 文件,它有一个包对象 hi,我可以使用它调用 sqrt 和 abs 方法。这是我的错误(我是 scala 的新手)。现在,我只是无法理解为什么我无法在包中实例化一个类。
  • 你有什么叫“hi”的包吗?
  • 不,我有一个名为 testpackage.src 的包。 hi 是 hi.scala 文件中 package testpackage.src 的一个包对象。

标签: scala


【解决方案1】:

在 hic.scala 中有一对额外的 {}。

package testpackage.src{

......

}

我已经测试过,删除后一切都很好,除了

println(new platify.src.hic) // error: type hic is not a member of package platify.src

platify 以前从未发生过。

【讨论】:

  • scala-lang.org/old/node/119.html - scala 中的包也是用这种格式创建的(带花括号)。
  • @莫涛多出一对{}不是问题。
  • platify 实际上是一个错字,我已在问题中修复它并替换为 testpackage。我现在正在测试没有大括号。
  • 对我来说,还是一样。无论有无大括号,错误都没有任何变化。
  • @KshitijMittal 是的,花括号不是问题。你是如何运行这些代码的?正如您在问题中提出的那样,我刚刚创建了三个 .scala 文件,并输入了 scalac *.scalascala hello。然后hic对象就成功实例化了,一切正常。
【解决方案2】:

我认为问题出在包对象 hi.scala 上。包对象名应该是你的包名,文件名应该是package.scala。例如,如果我想为“com.mine”创建包对象 那么我的包对象名称应该是“mine”

在您的情况下,如果 testpackage.src 被视为您的 package ,那么您的 包对象应该是

package testpackage

package object src {
    def abs(x: Double) = if (x>=0) x else -x

    def sqrt(x: Double) = {
        def sqrtIter(guess: Double, x: Double): Double =
            if(isGoodGuess(guess,x)) guess
            else sqrtIter(improve(guess,x),x)
        def isGoodGuess(guess: Double, x: Double) =
            abs(guess * guess - x)/x < .0001
        def improve(guess: Double, x: Double) = 
            (guess + x / guess)/2
        sqrtIter(1.0, x)
    }
}

Additional Info

【讨论】:

  • 不,实际上在 hi.scala 中,一切正常。我能够访问 hi.scala 对象的方法 sqrt 和 abs(如问题末尾所述)。但是我无法从 hic.scala 访问一个类(并实例化该类的一个对象)。所以,我的问题就是这样——为什么我不能从包中访问一个类,就像我能够访问一个对象一样?
  • 我仍然想知道,您的包对象如何使用名为 hi.scala.. 的文件名。它的经验法则是将包对象作为 package.scala,除非您使用嵌套包语法但是很不寻常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2022-01-03
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多