好吧,我一直在尝试从教科书中学习 Scala,但它是在 Scala 3 发布之前编写的,所以很多示例代码无法编译。
这本书是如何介绍命令行参数的:
println(args(0).toDouble+args(1).toDouble)
以及我将其转换为 Scala 3 兼容的最佳尝试:
@main def main(args: Array[String]) = {
println(args(0).toDouble+args(1).toDouble)
}
这是编译器告诉我的:
[error] ./add.scala:1:1
[error] No given instance of type scala.util.CommandLineParser.FromString[Array[String]] was found for parameter fs of method parseArgument in object CommandLineParser
[error] @main def main(args: Array[String]) = {
[error] ^
我该如何解决这个问题?还有一个类似的问题已经发布了,但答案似乎都是用 Scala 的早期版本编写的。至于官方发布指南,建议使用一些与CLP有关的东西,我不太明白。
如果您仅使用 Scala 3,则可以使用
@main
注释,但参数应定义为常规方法参数:
// Instead of:
@main def main(args: Array[String])
// Do:
@main def main(arg0: Double, arg1: Double)
需要注意的一件事是,参数可以输入,它们不再必须是
String
。转换会自动为您处理*。
你可以这样写:
@main def main(arg0: Double, arg1: Double) = {
println(arg0 + arg1)
}
*:默认情况下仅支持简单类型,但可以通过提供 TODO 实例来扩展。
如果您要交叉编译到 Scala 2 或者只是您更喜欢 Scala 2 方式,更接近 Java 的方式,请删除
@main
注释,并确保将该方法包含在 object
中。
object MyProgram {
def main(args: Array[String]) = ???
}
文档:https://docs.scala-lang.org/scala3/book/methods-main-methods.html