3

我正在通过 ScalaInAction 工作(这本书仍然是 MEAP,但代码在 github 上是公开的)现在我在第 2 章中查看这个 restClient: : https://github.com/nraychaudhuri/scalainaction/blob/master/ chap02/RestClient.scala

首先,我使用 scala 扩展设置了 intelliJ,并创建了一个 HelloWorld main()

<ALL the imports>

object HelloWorld {
   def main(args: Array[String]) {
     <ALL the rest code from RestClient.scala>
   }
}

编译时出现以下错误:

scala: forward reference extends over defintion of value command
val httppost = new HttpPost(url)
                ^

我可以通过移动以下行来解决此问题,直到相对于def's的顺序正确

require( args.size >= 2, "You need at least two arguments to make a get, post, or delete request")

val command = args.head
val params = parseArgs(args)
val url = args.last

command match {
  case "post"    => handlePostRequest
  case "get"     => handleGetRequest
  case "delete"  => handleDeleteRequest
  case "options" => handleOptionsRequest
}

在浏览 github 页面时,我发现了这个:https ://github.com/nraychaudhuri/scalinaction/tree/master/chap02/restclient

哪个使用实现 RestClient.scala 使用extends App而不是main()方法:

<All the imports>
object RestClient extends App {
   <All the rest of the code from RestClient.scala>
}

然后我将我的更改object HelloWorld为仅使用extends App而不是实现main()方法,并且它可以正常工作

为什么这样做的main()方法会产生错误但extends App不会产生错误?

4

1 回答 1

5

因为 main() 是一个方法,而变量的 in 方法不能是前向引用。

例如:

object Test {

   // x, y is object's instance variable, it could be forward referenced

   def sum = x + y // This is ok
   val y = 10    
   val x = 10

}

但是方法中的代码无法前向引用。

object Test {
    def sum = {
        val t = x + y // This is not ok, you don't have x, y at this point
        val x = 10
        val y = 20
        val z = x + y // This is ok
    }
}

在您的情况下,如果您将所有代码从 RestClient.scala 复制粘贴到 main(),您将遇到同样的问题,因为var url它是在 handlePostRequest 中使用后声明的。

于 2013-01-28T09:32:33.273 回答