2013-10-13 107 views
0

我正在嘗試運行Scala中的一些scala代碼。下面是代碼:運行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 

看來OK(?)。但調用

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沒有錯誤?非常感謝你的幫助!

回答

2

隨着scala ... test.scala,您正在腳本模式下運行test.scala。這不允許包裝定義。你有兩種選擇:你可以根據腳本要求格式test.scala格式要求,或者你寫一個全部類(這似乎你打算),並運行scala ... test只與類名。

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

斯卡拉實用程序運行使用Java運行時環境Scala代碼。運行Scala代碼的方式有三種:

  1. 沒有指定參數,Scala shell會以交互方式啓動和讀取命令。

  2. 使用-howtorun:指定對象時,頂級Scala對象的完全限定名可能是 指定的。該對象以前應該使用scalac(1)進行編譯。

  3. 使用-howtorun:指定腳本時,可以指定包含Scala代碼的文件。

如果-howtorun:保留爲默認值(猜測),然後斯卡拉命令將檢查 指定名稱的文件是否存在。如果是這樣,那麼它會將其視爲腳本文件;如果不是,那麼它將把它當作一個對象的名字。

最後一段很重要。


第一第二種情況下,使用完整的類:

要運行編譯的類,下面應該工作:

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 

但是你仍然需要做一些調整才能工作 - 你需要一個mai n類對象。下面應該做

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

另外,除去package聲明和test類的定義,只是把test主體的內容爲test.scala應該運行正常使用腳本引擎。


一個好的起點是來自主Scala站點的Getting Started文章。如果您閱讀Odersky的「Programming in Scala」(第一版可在互聯網上免費下載),則第4.4節介紹編譯完整的應用程序類,而腳本模式將在第2步第4步中解釋。