console.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 299 行
SCALA
299 行
/* __ *\** ________ ___ / / ___ Scala API **** / __/ __// _ | / / / _ | (c) 2003-2007, LAMP/EPFL **** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **** /____/\___/_/ |_/____/_/ | | **** |/ **\* */// $Id: Console.scala 12297 2007-07-13 10:56:44Z mihaylov $package scalaimport System.IO.{TextReader,TextWriter}import scala.util.DynamicVariableimport Predef._/** The <code>Console</code> object implements functionality for * printing Scala values on the terminal. There are also functions * for reading specific values. <code>Console</code> also defines * constants for marking up text on ANSI terminals. * * @author Matthias Zenger * @version 1.0, 03/09/2003 */object Console { // ANSI colors foreground final val BLACK = "\033[30m" final val RED = "\033[31m" final val GREEN = "\033[32m" final val YELLOW = "\033[33m" final val BLUE = "\033[34m" final val MAGENTA = "\033[35m" final val CYAN = "\033[36m" final val WHITE = "\033[37m" // ANSI colors background final val BLACK_B = "\033[40m" final val RED_B = "\033[41m" final val GREEN_B = "\033[42m" final val YELLOW_B = "\033[43m" final val BLUE_B = "\033[44m" final val MAGENTA_B = "\033[45m" final val CYAN_B = "\033[46m" final val WHITE_B = "\033[47m" // ANSI styles final val RESET = "\033[0m" final val BOLD = "\033[1m" final val UNDERLINED = "\033[4m" final val BLINK = "\033[5m" final val REVERSED = "\033[7m" final val INVISIBLE = "\033[8m" private val outVar = new DynamicVariable[TextWriter](System.Console.Out) private val inVar = new DynamicVariable[TextReader](System.Console.In) def out = outVar.value def in = inVar.value /** Set the default output stream. * * @param out the new output stream. */ def setOut(out: TextWriter) { outVar.value = out } /** Set the default output stream for the duration * of execution of one thunk. * * @param out the new output stream. * @param thunk the code to execute with * the new output stream active */ def withOut[T](out: TextWriter)(thunk: =>T): T = outVar.withValue(out)(thunk) /** Set the default input stream. * * @param reader specifies the new input stream. */ def setIn(reader: TextReader): Unit = { inVar.value = reader } /** Set the default input stream for the duration * of execution of one thunk. * * @param in the new input stream. * @param thunk the code to execute with * the new input stream active */ def withIn[T](reader: TextReader)(thunk: =>T): T = inVar.withValue(reader)(thunk) /** Print an object on the terminal. * * @param obj the object to print. */ def print(obj: Any): Unit = { out.Write(if (null == obj) "null" else obj.toString()); } /** Flush the output stream. This function is required when partial * output (i.e. output not terminated by a new line character) has * to be made visible on the terminal. */ def flush() { out.Flush() } /** Print a new line character on the terminal. */ def println(): Unit = out.WriteLine() /** Print out an object followed by a new line character. * * @param x the object to print. */ def println(x: Any): Unit = out.WriteLine(x) /** <p> * Format and print out some text (in a fashion similar to printf in C or * <code>printf</code> in Java 6). * </p> * <p> * The format of the text to print is specified by the parameter * <code>text</code>. The arguments that are inserted into specific * locations in <code>text</code> are provided with parameter * <code>args</code>. See class <a href="" target="contentFrame" * class="java/text/MessageFormat"><code>java.text.MessageFormat</code></a> * for a full specification of the <a href="#syntax" target="contentFrame" * class="java/util/Formatter">format syntax</a>. * </p> * * @param text the format of the text to print out. * @param args the parameters used to instantiate the format. * @throws java.lang.IllegalArgumentException */ def printf(text: String, args: Any*) { format(text, args: _*) } /** * @see <a href="#printf(java.lang.String,scala.Any*)" * target="contentFrame">Console.printf</a>. */ def format(text: String, args: Any*): Unit = if (text eq null) out.Write("null") else out.Write(text, args.toArray) /** Read a full line from the terminal. * * @return the string read from the terminal. */ def readLine(): String = in.ReadLine(); /** Print a formatted text and read a full line from the terminal * * @param text the format of the text to print out. * @param args the parameters used to instantiate the format. * @return the string read from the terminal. */ def readLine(text: String, args: Any*): String = { format(text, args: _*) readLine() } /** Read a boolean value from the terminal. * * @return the boolean value read from the terminal. */ def readBoolean(): Boolean = readLine().toLowerCase() match { case "true" => true case "t" => true case "yes" => true case "y" => true case _ => false } /** Read a byte value from the terminal. */ def readByte(): Byte = readLine().toByte /** Read a short value from the terminal. */ def readShort(): Short = readLine.toShort /** Read a char value from the terminal. */ def readChar(): Char = readLine() charAt 0 /** Read an int value from the terminal. */ def readInt(): Int = readLine().toInt /** Read an int value from the terminal. */ def readLong(): Long = readLine().toLong /** Read a float value from the terminal. */ def readFloat(): Float = readLine().toFloat /** Read a double value from the terminal. */ def readDouble(): Double = readLine().toDouble// /** Read in some structured input, specified by a format specifier.// * See class <code>java.text.MessageFormat</code> for details of// * the format specification.// *// * @param format the format of the input.// * @return a list of all extracted values.// */// def readf(format: String): List[Any] =// textComponents(new MessageFormat(format).parse(readLine()))// /** Read in some structured input, specified by a format specifier.// * Opposed to <code>readf</code>, this function only returns the// * first value extracted from the input according to the format// * specification.// *// * @param format ...// * @return ...// */// def readf1(format: String): Any = readf(format).head// /** Read in some structured input, specified by a format specifier.// * Opposed to <code>readf</code>, this function only returns the// * first two values extracted from the input according to the format// * specification.// *// * @param format ...// * @return ...// */// def readf2(format: String): (Any, Any) = {// val res = readf(format)// (res.head, res.tail.head)// }// /** Read in some structured input, specified by a format specifier.// * Opposed to <code>readf</code>, this function only returns the// * first three values extracted from the input according to the format// * specification.// *// * @param format ...// * @return ...// */// def readf3(format: String): (Any, Any, Any) = {// val res = readf(format)// (res.head, res.tail.head, res.tail.tail.head)// }// private def textComponents(a: Array[AnyRef]): List[Any] = {// var i: Int = a.length - 1// var res: List[Any] = Nil// while (i >= 0) {// res = (a(i) match {// case x: java.lang.Boolean => x.booleanValue()// case x: java.lang.Byte => x.byteValue()// case x: java.lang.Short => x.shortValue()// case x: java.lang.Character => x.charValue()// case x: java.lang.Integer => x.intValue()// case x: java.lang.Long => x.longValue()// case x: java.lang.Float => x.floatValue()// case x: java.lang.Double => x.doubleValue()// case x => x// }) :: res;// i = i - 1// }// res// }// private def textParams(s: Seq[Any]): Array[AnyRef] = {// val res = new Array[AnyRef](s.length);// var i: Int = 0;// val iter = s.elements;// while (iter.hasNext) {// res(i) = iter.next match {// case x: Boolean => new java.lang.Boolean(x)// case x: Byte => new java.lang.Byte(x)// case x: Short => new java.lang.Short(x)// case x: Char => new java.lang.Character(x)// case x: Int => new java.lang.Integer(x)// case x: Long => new java.lang.Long(x)// case x: Float => new java.lang.Float(x)// case x: Double => new java.lang.Double(x)// case x: Unit => "()"// case x: AnyRef => x// }// i = i + 1// }// res// }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?