我是编程课的助教.有一项任务,学生必须写Scala.我对Scala不够熟练,无法快速阅读它以验证程序是否正常工作或能够在Scala中快速编写脚本以运行测试输入.
但是,我在Java方面非常有能力.我需要一些关于使用Java知识对Scala赋值进行分级的简单方法的建议.有没有办法将Scala文件加载到Java中,以便我可以使用一些简单的Java方法来为其程序运行测试输入?我知道他们都编译成Java字节码,所以我认为这应该是可能的.
Scala生成类文件.Scala类文件可以运行java,只需要scala-library.jar在类路径上.Scala程序的入口点似乎是Java中类的静态main方法,就像在Java中一样.区别在于,在Scala程序中,该main方法是在a上声明的方法object.例如:
Java的:
public class Test {
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
斯卡拉:
object Test {
def main(args: Array[String]) {
// or:
// def main(args: Array[String]): Unit = {
}
}
Run Code Online (Sandbox Code Playgroud)
通过提供单元测试进行测试的想法很有意思,但它可能会强制使用非惯用的Scala代码.并且,在极少数情况下,甚至可能会阻止解决方案完全在Scala中编写.
所以我认为最好只指定命令行参数,输入(可能是stdin)和输出(stdout).您可以轻松地与任何运行scala Test parms,或java -cp /path/to/scala-library.jar Test parms.
但是,测试单个函数的输入可能要困难得多,因为它们可能需要Scala类作为输入,其中一些可能有点难以从Java初始化.如果你走这条路,你可能不得不提出更多问题来满足特定需求.
或许,另一种方法是使用命令行中的Scala表达式.例如,假设您有以下代码:
object Sum {
def apply(xs: Seq[Int]) = xs reduceLeft (_ + _)
}
Run Code Online (Sandbox Code Playgroud)
它可以像这样轻松地进行测试:
dcs@ayanami:~/tmp$ scalac Sum.scala
dcs@ayanami:~/tmp$ scala -cp . -e 'println(Sum.apply(Seq(1, 2, 3)))'
6
Run Code Online (Sandbox Code Playgroud)
要从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}))));
}
}
Run Code Online (Sandbox Code Playgroud)
当您将学生代码生成的.class文件放入类路径时,您只需调用学生开发的方法即可.使用优秀的Java IDE,您甚至可以完成代码.
重新提出问题:假设您有一个需要测试的Java库.但是你只有类文件,而不是源代码.你怎么做呢? - 现在,与Scala的情况完全相同.在某些情况下,您需要访问奇怪的静态变量(例如$MODULE),但这不应成为障碍.tobym用他的答案向你指出了正确的方向.
但严重的是,学生的教学价值是什么?你只能告诉他们他们的程序是否做正确的事情,但你不能指出他们究竟犯了什么错误以及如何纠正它.他们已经自己知道他们的节目是否正确.当他们犯错误时,告诉他们他们犯了错误并不能帮助他们.您需要准确地向他们展示代码中的错误,以及如何解决它.这是你可以帮助他们学习的唯一方法.
如果它只是一个任务而不是更多,也许你可以找到更好的方法.也许你可以邀请另一位精通Scala的学生来帮助你解决这个问题.或者也许你可以向整个班级展示一些错误的课程,并在学生之间进行讨论,他们会在那里找出自己出了什么问题以及如何纠正错误.以这种方式谈论代码可以帮助他们很多,如果做得对,可以是一个宝贵的教训.因为这反映了他们将来会在商业生活中做些什么.没有教授告诉他们如何纠正他们的错误.相反,他们必须与他们的同事一起解决这个问题.所以,也许你可以将你缺乏的知识转化为学生的机会.
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |