不能从REPL运行.scala文件?

时间:2014-04-11 14:26:39

标签: scala runtime-error

我是斯卡拉的新人。

我想运行在我的文件while.scala写的函数:

def whileLoop {
    var i = 1
    while(i <= 3) {
        println(i)
        i += 1
    }
}
whileLoop

这是它如何看待REPL:

scala> scala /home/nazar/Downloads/while.scala
<console>:1: error: illegal start of simple expression

如果我从书中理解的话。我需要指定.scala文件位置并运行:

  

scala /path/to/file.scala

为什么会失败?

以下是本书的摘录:

You can run the code like this:
batate$ scala code/scala/while.scala
1
2
3

更新

我尝试了:load选项,但是当我想运行另一个文件for_loop.scala时:

def forLoop {
    println( "for loop using Java-style iteration" )
    for(i <- 0 until args.length) {
        println(args(i))
    }
}    
forLoop

失败了:

scala> :load /home/nazar/Downloads/for_loop.scala
Loading /home/nazar/Downloads/for_loop.scala...
<console>:9: error: not found: value args
           for(i <- 0 until args.length) {
                            ^
<console>:8: error: not found: value forLoop
              forLoop
              ^

scala> :load /home/nazar/Downloads/for_loop.scala hello scala
That file does not exist

如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

你这样做,从shell /命令行,而不是在REPL中(%是名义shell提示符):

% scala MyScalaScriptName.scala

你这样做了:

% scala
scala> scala while.scala
<console>:1: error: illegal start of simple expression

Scala REPL中唯一已知的是Scala代码本身和一些内置的特殊命令。但是,其中一个会做你想做的事:

% cd
% scala
scala> :load Downloads/while.scala
Loading Downloads/while.scala
1
2
3

答案 1 :(得分:2)

为了使用命令行参数(通过args),需要扩展App或更常见的来定义主体 main 对象中的方法,即def main(args: Array[String])方法,它定义程序的入口点。例如,考虑

object AnyName extends App {
  def forLoop {
    println( "for loop using Java-style iteration" )
    for(i <- 0 until args.length) {
        println(args(i))
    }
  }
  forLoop
}

AnyName.main(Array("first","second"))

尝试从REPL加载它。另一种方法是,

object AnyName {
  def main(args: Array[String]) {
    println( "for loop using Java-style iteration" )
    for(i <- 0 until args.length) {
        println(args(i))
    }
  }
}

AnyName.main(Array("first","second"))

在后一个示例中,请注意args的范围,绑定到main中的参数。