无论如何在 Scala 中实现可选的命令行参数?
Is there anyway to implement optional command line arguments in Scala?
我想在我的程序中实现命令行,这样它们就可以是可选的,但到目前为止,我能让我的程序达到 运行 的唯一方法是在我 [=20= 时输入 3 个参数] 命令行中的程序。有什么办法让我只需要输入至少一个参数,而将另外两个作为可选参数吗?
这是我的代码的开头:
import scala.collection.mutable.ListBuffer
import util.control.Breaks._
object part3 {
var newStartTime = 0
var newEndTime = 0
var csvStartTime = 0
var csvEndTime = 0
def main(args: Array[String]): Unit = {
var csV = args(0)
var daY = args(1)
var time1 = args(2)
var time2 = args(3)
newEndTime = checkLengths(time1, time2)
val bufferedSource = io.Source.fromFile(csV)
var z = new ListBuffer[String]()
var z2 = new ListBuffer[String]()
var i = 0
更新代码:
val fileName = args(0)
courseCode1 = args(1)
val courseCode2: Option[String] = Try(args(2)).toOption
val courseCode3: Option[String] = Try(args(3)).toOption
val extraCourseSelection = for {
c2 <- courseCode2
c3 <- courseCode3
}
courseCodeFixed1 = courseCode1.toUpperCase.patch(4, " ", 0)
if(c2!=null)
{
courseCodeFixed2 = c2.toUpperCase.patch(4, " ", 0)
}
if(c3!=null)
{
courseCodeFixed3 = c3.toUpperCase.patch(4, " ", 0)
}
print(courseCodeFixed2)
print(courseCodeFixed3)
我尝试实施此解决方案,但现在它根本不想读取我的任何命令行参数
您可以使用scala.util.Try
捕获索引越界异常并使用toOption
将Try[_]
转换为Option[_]
:
import scala.util.Try
...
val csV: Option[String] = Try(args(0)).toOption
val daY: Option[String] = Try(args(1)).toOption
val time1: Option[String] = Try(args(2)).toOption
val time2: Option[String] = Try(args(3)).toOption
然后要使用可选值,您可以使用 for comprehension:
val newEndTime = for {
t1 <- time1
t2 <- time2
} yield checkLengths(t1, t2)
val fileName = args(0)
val courseCode1 = args(1).toUpperCase.patch(4, " ", 0)
val courseCode2 = args.lift(2).map(_.toUpperCase.patch(4, " ", 0))
val courseCode3 = args.lift(3).map(_.toUpperCase.patch(4, " ", 0))
如果您不想要 Option[String]
个结果,您可以添加 .getOrElse()
以提供默认值。
我想在我的程序中实现命令行,这样它们就可以是可选的,但到目前为止,我能让我的程序达到 运行 的唯一方法是在我 [=20= 时输入 3 个参数] 命令行中的程序。有什么办法让我只需要输入至少一个参数,而将另外两个作为可选参数吗?
这是我的代码的开头:
import scala.collection.mutable.ListBuffer
import util.control.Breaks._
object part3 {
var newStartTime = 0
var newEndTime = 0
var csvStartTime = 0
var csvEndTime = 0
def main(args: Array[String]): Unit = {
var csV = args(0)
var daY = args(1)
var time1 = args(2)
var time2 = args(3)
newEndTime = checkLengths(time1, time2)
val bufferedSource = io.Source.fromFile(csV)
var z = new ListBuffer[String]()
var z2 = new ListBuffer[String]()
var i = 0
更新代码:
val fileName = args(0)
courseCode1 = args(1)
val courseCode2: Option[String] = Try(args(2)).toOption
val courseCode3: Option[String] = Try(args(3)).toOption
val extraCourseSelection = for {
c2 <- courseCode2
c3 <- courseCode3
}
courseCodeFixed1 = courseCode1.toUpperCase.patch(4, " ", 0)
if(c2!=null)
{
courseCodeFixed2 = c2.toUpperCase.patch(4, " ", 0)
}
if(c3!=null)
{
courseCodeFixed3 = c3.toUpperCase.patch(4, " ", 0)
}
print(courseCodeFixed2)
print(courseCodeFixed3)
我尝试实施此解决方案,但现在它根本不想读取我的任何命令行参数
您可以使用scala.util.Try
捕获索引越界异常并使用toOption
将Try[_]
转换为Option[_]
:
import scala.util.Try
...
val csV: Option[String] = Try(args(0)).toOption
val daY: Option[String] = Try(args(1)).toOption
val time1: Option[String] = Try(args(2)).toOption
val time2: Option[String] = Try(args(3)).toOption
然后要使用可选值,您可以使用 for comprehension:
val newEndTime = for {
t1 <- time1
t2 <- time2
} yield checkLengths(t1, t2)
val fileName = args(0)
val courseCode1 = args(1).toUpperCase.patch(4, " ", 0)
val courseCode2 = args.lift(2).map(_.toUpperCase.patch(4, " ", 0))
val courseCode3 = args.lift(3).map(_.toUpperCase.patch(4, " ", 0))
如果您不想要 Option[String]
个结果,您可以添加 .getOrElse()
以提供默认值。