好的,我一直在尝试从教科书中学习 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 相关的东西,我不明白。
@main
会将所有未解析的参数传递给String*
参数(如果有)。如果没有解析的参数,则意味着:如果您只使用 Scala 3,那么
@main
注释是可行的方法,但参数应该定义为常规方法参数:需要注意的一点是,参数可以输入,不再必须是
String
s。转换会自动处理*。你可以这样写:
*:默认情况下仅支持简单类型,但可以通过提供实例来
scala.util.CommandLineParser.FromString
扩展。请注意,这是您最初收到的错误:编译器说“我不知道如何从 转换String
为Array[String]
”编辑
String*
:正如 CoreyOConnor 在另一个答案中提到的,如果您没有明确输入某些参数,也可以将所有剩余参数作为 (varargs) 获取。如果您正在交叉编译到 Scala 2 或者只是您更喜欢 Scala 2 的方式(更接近 Java),那么请删除
@main
注释并确保在 中包含该方法object
。文档:https ://docs.scala-lang.org/scala3/book/methods-main-methods.html
我喜欢 GAel 解决方案,但要想出一些不同的东西,如果您刚开始使用 Scala 3,请坚持使用传统的主要方法(def main(args:Array [String]):Unit)或使用带有明确参数的更简单的 @main 方法(@main def addNumbers(arg1:String,arg2:String):Unit)。
如果要以 Array[String] 形式访问 args,则应定义不带 @main 注释的 main 方法:
您可以使用命令行参数运行该程序,args 将把所有参数保存在一个数组中。