编写Java程序给Scala Homeworks评分

编写Java程序给Scala Homeworks评分,java,scala,Java,Scala,我是编程课的助教。有一个作业,学生必须写Scala。我对Scala不够精通,无法快速阅读以验证程序是否正常工作,也无法快速编写Scala脚本以运行测试输入 然而,我在Java方面很有能力。我需要一些关于使用我的Java知识对Scala作业评分的简单方法的建议。有没有办法将Scala文件加载到Java中,这样我就可以使用一些简单的Java方法来运行程序的测试输入?我知道它们都编译成Java字节码,所以我认为这应该是可能的 你可以跑步 scalac SomeProgram.scala scala

我是编程课的助教。有一个作业,学生必须写Scala。我对Scala不够精通,无法快速阅读以验证程序是否正常工作,也无法快速编写Scala脚本以运行测试输入

然而,我在Java方面很有能力。我需要一些关于使用我的Java知识对Scala作业评分的简单方法的建议。有没有办法将Scala文件加载到Java中,这样我就可以使用一些简单的Java方法来运行程序的测试输入?我知道它们都编译成Java字节码,所以我认为这应该是可能的

你可以跑步

 scalac SomeProgram.scala
 scala SomeProgram input1

在编写触发scala编译的java并运行生成的字节码的过程中,需要花费大量时间。您可以将scala编译成.class文件(例如“scalac./foo.scala”),并从java分级程序中运行方法


这可能是一个有用的参考:

好吧,你可以在作业之前编写单元测试(例如使用JUnit),让学生编写程序以符合测试要求。 或者您可以将scala反编译为java(例如,使用JDGUI)


但公平地说,如果学生们只打算在这一个特定的作业中使用scala,那么他们多半会直接从java翻译成scala,而不是编写惯用的scala。在这种情况下,我相信您将能够非常容易地理解scala代码,因为它看起来几乎完全像java…

当您将学生代码生成的.class文件放入类路径时,您只需调用学生开发的方法即可。有了一个好的JavaIDE,您甚至可以完成代码

重新表述这个问题:假设您有一个需要测试的Java库。但是您只有类文件,没有源代码。你是怎么做到的现在,Scala的情况也完全一样。在某些情况下,您将需要访问奇怪的静态变量(例如
$MODULE
),但这不应成为障碍。托比姆的回答为你指明了正确的方向

但说真的,对学生来说,什么是教学价值呢?你只能告诉他们他们的程序是否做了正确的事情,但你不能确切地指出他们犯了什么错误以及如何纠正错误。他们将自己知道他们的程序是否正确。当他们犯错时,仅仅告诉他们他们做错了什么对他们毫无帮助。您需要准确地向他们显示代码中的错误所在,以及如何修复错误。这是你帮助他们学习的唯一方法


如果只是一个作业而不是更多,也许你能找到更好的方法。也许你可以邀请另一个精通Scala的学生来帮你解决这个问题。或者,你可以向全班展示一些错误的程序,并在学生中发起讨论,让他们自己找出哪里出了问题以及如何纠正。以这种方式谈论代码可以帮助他们很多,而且,如果做得好的话,可以成为宝贵的一课。因为这反映了他们在以后的商业生活中会做些什么。不会有教授告诉他们如何纠正错误。相反,他们必须与同事一起解决这个问题。因此,也许你可以把自己知识的缺乏转化为学生的一个机会。

Scala生成类文件。Scala类文件可以使用
java
运行,只需要类路径上有
Scala library.jar
。Scala程序的入口点在Java看来是类上的静态
main
方法,就像在Java中一样。区别在于,在Scala程序中,
main
方法是在
对象上声明的方法。例如:

爪哇:

斯卡拉:

object Test {
    def main(args: Array[String]) { 
    // or:
    // def main(args: Array[String]): Unit = { 
    }
}
通过提供单元测试进行测试的想法很有趣,但它可能会强制使用非惯用的Scala代码。而且,在一些罕见的情况下,甚至可能会阻止完全用Scala编写解决方案

所以我认为最好只指定命令行参数、输入(可能是stdin)和输出(stdout)。您可以使用
scala测试参数
java-cp/path/to/scala-library.jar测试参数
轻松运行它

不过,在单个函数上测试输入可能要困难得多,因为它们可能需要Scala类作为输入,而且其中一些函数可能有点难以从Java初始化。如果你走这条路,你可能需要问更多的问题来满足特定的需求

另一种选择可能是从命令行使用Scala表达式。例如,假设您有以下代码:

object Sum {
  def apply(xs: Seq[Int]) = xs reduceLeft (_ + _)
}
它可以很容易地进行测试,如下所示:

dcs@ayanami:~/tmp$ scalac Sum.scala
dcs@ayanami:~/tmp$ scala -cp . -e 'println(Sum.apply(Seq(1, 2, 3)))'
6
要在Java中执行同样的操作,您可以编写如下代码:

import scala.collection.Seq$;

public class JavaTest {
    static public void main(String[] args) {
        System.out.println(Sum.apply(Seq$.MODULE$.apply(scala.Predef.wrapIntArray(new int[] {1, 2, 3}))));
    }
}

学生们编写的scala程序有很多不同的功能,需要单独测试,因此以这种方式运行输入对我来说不起作用。还有其他想法吗?您知道如何在java程序中编译scala吗?然后您会使用反射来查找函数吗?或者您是否有一些它们正在使用的集合包和接口?告诉abit如何查看给定scala类的java。我会用scalac来编译Monetly,问问班上成绩最高的家伙。他会告诉你他是如何测试他的程序的,这可能会有很大帮助!那么你是在问如何教授你不知道的东西?@user670080如果你是Scala课程的助教,也许你应该自己去学Scala?@Sean+1如果我参加了一个涉及Scala的课程,而助教不知道(或想学),我会感到不安。@dbyrne或想学这是关键短语。被不愿意学习的人教去学习。从命令行描述Scala表达式的用法是多么矛盾啊+1扭转知识匮乏的好方法
import scala.collection.Seq$;

public class JavaTest {
    static public void main(String[] args) {
        System.out.println(Sum.apply(Seq$.MODULE$.apply(scala.Predef.wrapIntArray(new int[] {1, 2, 3}))));
    }
}