如何通过命令行在scala中传递输入

时间:2015-09-04 05:53:22

标签: scala

  import scala.io._    

  object Sum {    
     def main(args :Array[String]):Unit = {    

      println("Enter some numbers and press ctrl-c")

     val input = Source.fromInputStream(System.in)

     val lines = input.getLines.toList

     println("Sum "+sum(lines))

   }

   def toInt(in:String):Option[Int] =

      try{

        Some(Integer.parseInt(in.trim))

      }

      catch    {
       case e: NumberFormatException => None    
   } 

   def sum(in :Seq[String]) = {

     val ints = in.flatMap(s=>toInt(s))

      ints.foldLeft(0) ((a,b) => a +b)

     } }

我试图在传递输入后运行此程序我已经按下了    ctrl + c但是

它给出了这条消息E:\ Scala> scala HelloWord.scala输入一些    数字并按ctrl-c 1 2 3终止批处理作业(是/否)?

3 个答案:

答案 0 :(得分:2)

附加观察,注意trait App使对象可执行,因此不必声明main(...)函数,例如像这样,

object Sum extends App {
  import scala.io._
  import scala.util._

  val nums = Source.stdin.getLines.flatMap(v => Try(v.toInt).toOption)
  println(s"Sum: ${nums.sum}")
}

使用Try,从StringInt的非成功转化转为None并展平。

另请注意,对象和类是大写的,因此按惯例而不是object sum我们写object Sum

答案 1 :(得分:2)

您还可以使用外部API。我非常喜欢scallop API

答案 2 :(得分:1)

试试这段代码。它应该按预期工作。

object Sum {
    def main(args: Array[String]) {
        val lines = io.Source.stdin.getLines
        val numbers = lines.map(_.toInt)
        println(s"Sum: ${numbers.sum}")
    }
}

另外,结束输入流的正确快捷方式是 Ctrl + D