【问题标题】:Error during running of scala codes [duplicate]运行scala代码时出错[重复]
【发布时间】:2013-10-13 13:18:31
【问题描述】:

我正在尝试运行“Scala in Action”一书中的一些 scala 代码。以下是代码:

MongoClient.scala:

package com.scalainaction.mongo

import com.mongodb._

class MongoClient(val host: String, val port: Int){
    require(host != null, "You have to provide a host name")
    private val underlying = new Mongo(host, port)
    def this() = this("127.0.0.1", 27017)

    def version = underlying.getVersion
    def dropDB(name: String) = underlying.dropDatabase(name)
    def createDB(name: String) = DB(underlying.getDB(name))
    def db(name: String) = DB(underlying.getDB(name))
}

DB.scala:

package com.scalainaction.mongo

import com.mongodb.{DB => MongoDB}
import scala.collection.convert.Wrappers._

class DB private(val underlying: MongoDB) {
    def collectionName = for(name <- new
    JSetWrapper(underlying.getCollectionNames)) yield name
}

object DB {
    def apply(underlying: MongoDB) = new DB(underlying)
}

test.scala:

package com.scalainaction.mongo

import com.scalainaction.mongo._

class test{
    def client = new MongoClient
    def db = client.createDB("mydb")

    for (name <- db.collectionName) println(name)
}

编译后使用

scalac -cp /.../mongo-java-driver-2.11.3.jar MongoClient.scala DB.scala test.scala

我明白了:

MongoClient.scala:7: warning: constructor Mongo in class Mongo is deprecated: see corresponding Javadoc for more information.
    private val underlying = new Mongo(host, port)
                                 ^
one warning found

看起来不错(?)。但是调用后

scala -cp /.../mongo-java-driver-2.11.3.jar -deprecation  test.scala

它显示:

/.../test.scala:1: error: illegal start of definition
package com.scalainaction.mongo
^
one error found

我怎样才能不出错地运行 test.scala?非常感谢您的帮助!

【问题讨论】:

    标签: scala


    【解决方案1】:

    使用scala ... test.scala,您将在脚本模式下运行test.scala。这不允许包定义。您有两个选择:要么根据脚本要求格式化test.scala,要么编写一个完整类(这似乎是你的意图)并运行scala ... test类名。

    如果你运行man scala,你可以看到不同的解释:

    scala 实用程序使用 Java 运行时环境运行 Scala 代码。要运行的 Scala 代码通过以下三种方式之一指定:

    1. 不指定参数时,Scala shell 会启动并以交互方式读取命令。

    2. 指定 -howtorun:object 后,顶级 Scala 对象的完全限定名称可能是 指定的。该对象之前应该已经使用 scalac(1) 编译过。

    3. 指定 -howtorun:script 后,可以指定包含 Scala 代码的文件。

    如果 -howtorun: 保留为默认值(猜测),那么 scala 命令将检查是否存在 指定的名称存在。如果是,则将其视为脚本文件;如果没有,那么它 会将其视为对象的名称。

    最后一段很重要。


    首先是第二种情况,使用完整的类:

    要运行编译后的类,以下应该可以工作:

    scala -cp /.../mongo-java-driver-2.11.3.jar:. test
    

    这是以下更详细调用的简写:

    java -cp /.../mongo-java-driver-2.11.3.jar:/path/to/scala/scala-library.jar:. test
    

    但是您仍然需要对其进行调整以使其正常工作-您需要一个主类对象。以下应该做的

    object test extends App { ... }  // instead of class test { ... }
    

    或者,删除package 声明和test 类定义,并将test 主体的内容放入test.scala 中,使用脚本引擎应该可以正常运行。


    一个很好的起点是来自 Scala 主站点的 Getting Started 文章。如果您阅读了 Odersky 的“Scala 编程”(第一版可在 Internet 上免费获得),第 4.4 节介绍了编译完整的应用程序类,而脚本模式在第 2 章第 4 步中进行了说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多