0

我正在尝试运行“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)
}

测试.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没有错误?非常感谢你的帮助!

4

1 回答 1

2

使用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 主站点的入门文章。如果您阅读了 Odersky 的“Scala 编程”(第一版可在 Internet 上免费获得),第 4.4 节涵盖了编译完整的应用程序类,而脚本模式在第 2 章第 4 步中进行了解释。

于 2013-10-13T13:23:42.880 回答