如何编译此Scala代码

时间:2014-11-19 01:27:25

标签: scala scalac

我有一个名为sumit.scala的文件,其中包含以下内容

object sumit {
    def main(args: Array[String]) = {
        val start:Double = System.nanoTime
        total_select_values(1 to 15000, {e => true})
        val end:Double = System.nanoTime
        println("time " + (end - start)/ 1000000000.0)
        println("")
    }
}

def total_select_values(list: Range, selector : Int => Boolean) = {
  var sum = 0
  list.foreach { e =>
    if (selector(e)) sum += e
  }
  sum
}

我正在尝试在命令行上编译它

scalac sumit.scala

编译没有错误但是当我运行它时

scala sumit

我收到了一堆错误,我是scala的新手,我只是在编译后尝试对这段代码进行计时以查看性能差异。我已经尝试将“total_select_values”放在对象中并且输出(如此处所示),没有任何区别。

感谢您的帮助!

更新了Scala信息和实际错误

Scala版本2.11.4 Java 1.7.0_40

java.lang.NoSuchMethodException:sumit.main([Ljava.lang.String;)         在java.lang.Class.getMethod(未知来源)         在scala.reflect.internal.util.ScalaClassLoader $ class.run(ScalaClassLoader.scala:66)         在scala.reflect.internal.util.ScalaClassLoader $ URLClassLoader.run(ScalaClassLoader.scala:101)         在scala.tools.nsc.CommonRunner $ class.run(ObjectRunner.scala:22)         在scala.tools.nsc.ObjectRunner $ .run(ObjectRunner.scala:39)         在scala.tools.nsc.CommonRunner $ class.runAndCatch(ObjectRunner.scala:29)         在scala.tools.nsc.ObjectRunner $ .runAndCatch(ObjectRunner.scala:39)         在scala.tools.nsc.MainGenericRunner.runTarget $ 1(MainGenericRunner.scala:65)         在scala.tools.nsc.MainGenericRunner.run $ 1(MainGenericRunner.scala:87)         在scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)         在scala.tools.nsc.MainGenericRunner $ .main(MainGenericRunner.scala:103)         在scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

3 个答案:

答案 0 :(得分:1)

功能

def total_select_values ...

必须进入一个对象或类。这似乎是基于Scala的Scala的约束 JVM;不能拥有真正的自由功能。

答案 1 :(得分:0)

尝试像这样运行

scala sumit.scala

即添加文件的扩展名。

答案 2 :(得分:0)

当我运行scalac时,您所拥有的代码会给我以下错误:

sumit.scala:11: error: expected class or object definition
def total_select_values(list: Range, selector : Int => Boolean) = {
^
one error found

但是,如果我更改代码以将total_select_values放在sumit对象中(如注释中所示):

object sumit {
    def main(args: Array[String]) = {
        val start:Double = System.nanoTime
        total_select_values(1 to 15000, {e => true})
        val end:Double = System.nanoTime
        println("time " + (end - start)/ 1000000000.0)
        println("")
    }

    def total_select_values(list: Range, selector : Int => Boolean) = {
        var sum = 0
        list.foreach { e =>
            if (selector(e)) sum += e
        }
        sum
    }
}

然后,当我跑:

scalac sumit.scala 
scala sumit

它产生:

time 0.003286401time 0.003286401

但是,因为scala可以以交互方式运行。刚跑:

scala sumit.scala 

也有效。 (scalac步骤可以省略。)