如何通过命令行参数填充Scala Case Class实例?
Scala命令行参数赋值方案
先理清楚核心逻辑
Scala程序的命令行参数会通过入口方法的args参数传入,我们要做的就是把这些参数映射到CommandArgs实例和对应的变量上。
1. 保留原CommandArgs结构的实现
如果一定要维持你给出的CommandArgs(args: Seq[String])定义,可以这么写:
// 原case class定义 case class CommandArgs(args: Seq[String]) // 程序入口 object Main extends App { // 将命令行传入的Array[String]转成Seq,创建CommandArgs实例 val cmdArgs = CommandArgs(args.toSeq) // 从实例的args序列中提取三个参数,赋值给对应变量 val argsOne = cmdArgs.args(0) val argsTwo = cmdArgs.args(1) val argsThree = cmdArgs.args(2) // 测试输出 println(s"参数1:$argsOne,参数2:$argsTwo,参数3:$argsThree") }
运行时在命令行输入:scala Main 参数值1 参数值2 参数值3,就能完成赋值。
2. 更合理的优化方案(推荐)
如果你的需求就是对应三个固定参数,直接把CommandArgs改成带三个字段的形式,用起来更直观,还能避免索引越界问题:
// 优化后的case class case class CommandArgs(argsOne: String, argsTwo: String, argsThree: String) // 程序入口 object Main extends App { // 先检查参数数量是否符合要求 if (args.length != 3) { println("请传入三个参数:argsOne argsTwo argsThree") sys.exit(1) } // 直接用命令行参数创建CommandArgs实例 val cmdArgs = CommandArgs(args(0), args(1), args(2)) // 直接调用实例字段即可 println(s"参数1:${cmdArgs.argsOne},参数2:${cmdArgs.argsTwo},参数3:${cmdArgs.argsThree}") }
注意点
- 必须处理参数数量不足的情况,不然会抛出
ArrayIndexOutOfBoundsException异常。 - 使用
Apptrait可以省去手动写main方法的步骤,它会自动把命令行参数绑定到args变量上。
内容的提问来源于stack exchange,提问作者Julie
相关产品推荐
相关产品推荐

