博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala中的s函数
阅读量:7066 次
发布时间:2019-06-28

本文共 5273 字,大约阅读时间需要 17 分钟。

  hot3.png

刚才看到了Scala中的一个插入器函数s,觉得真好玩,写出来与大家分享。

s是StringContext类的一个简写形式,来看看StringContext的源码

case class StringContext(parts: String*) {  import StringContext._  /** Checks that the length of the given argument `args` is one less than the number   *  of `parts` supplied to the enclosing `StringContext`.   *  @param `args` The arguments to be checked.   *  @throws IllegalArgumentException  if this is not the case.   */  def checkLengths(args: Seq[Any]): Unit =    if (parts.length != args.length + 1)      throw new IllegalArgumentException("wrong number of arguments ("+ args.length        +") for interpolated string with "+ parts.length +" parts")  /** The simple string interpolator.   *   *  It inserts its arguments between corresponding parts of the string context.   *  It also treats standard escape sequences as defined in the Scala specification.   *  Here's an example of usage:   *  {
{
{   *    val name = "James"   *    println(s"Hello, $name")  // Hello, James   *  }}}   *  In this example, the expression $name is replaced with the `toString` of the   *  variable `name`.   *  The `s` interpolator can take the `toString` of any arbitrary expression within   *  a `${}` block, for example:   *  {
{
{   *    println(s"1 + 1 = ${1 + 1}")   *  }}}   *  will print the string `1 + 1 = 2`.   *   *  @param `args` The arguments to be inserted into the resulting string.   *  @throws IllegalArgumentException   *          if the number of `parts` in the enclosing `StringContext` does not exceed   *          the number of arguments `arg` by exactly 1.   *  @throws StringContext.InvalidEscapeException   *          if a `parts` string contains a backslash (`\`) character   *          that does not start a valid escape sequence.   */  def s(args: Any*): String = standardInterpolator(treatEscapes, args)  /** The raw string interpolator.   *   *  It inserts its arguments between corresponding parts of the string context.   *  As opposed to the simple string interpolator `s`, this one does not treat   *  standard escape sequences as defined in the Scala specification.   *   *  For example, the raw processed string `raw"a\nb"` is equal to the scala string `"a\\nb"`.   *   *  ''Note:'' Even when using the raw interpolator, Scala will preprocess unicode escapes.   *  For example:   *  {
{
{   *    scala> raw"\u005cu0023"   *    res0: String = #   *  }}}   *   *  @param `args` The arguments to be inserted into the resulting string.   *  @throws IllegalArgumentException   *          if the number of `parts` in the enclosing `StringContext` does not exceed   *          the number of arguments `arg` by exactly 1.   */  def raw(args: Any*): String = standardInterpolator(identity, args)  def standardInterpolator(process: String => String, args: Seq[Any]): String = {    checkLengths(args)    val pi = parts.iterator    val ai = args.iterator    val bldr = new JLSBuilder(process(pi.next()))    while (ai.hasNext) {      bldr append ai.next      bldr append process(pi.next())    }    bldr.toString  }  /** The formatted string interpolator.   *   *  It inserts its arguments between corresponding parts of the string context.   *  It also treats standard escape sequences as defined in the Scala specification.   *  Finally, if an interpolated expression is followed by a `parts` string   *  that starts with a formatting specifier, the expression is formatted according to that   *  specifier. All specifiers allowed in Java format strings are handled, and in the same   *  way they are treated in Java.   *   *  For example:   *  {
{
{   *    val height = 1.9d   *    val name = "James"   *    println(f"$name%s is $height%2.2f meters tall")  // James is 1.90 meters tall   *  }}}   *   *  @param `args` The arguments to be inserted into the resulting string.   *  @throws IllegalArgumentException   *          if the number of `parts` in the enclosing `StringContext` does not exceed   *          the number of arguments `arg` by exactly 1.   *  @throws StringContext.InvalidEscapeException   *          if a `parts` string contains a backslash (`\`) character   *          that does not start a valid escape sequence.   *   *  Note: The `f` method works by assembling a format string from all the `parts` strings and using   *  `java.lang.String.format` to format all arguments with that format string. The format string is   *  obtained by concatenating all `parts` strings, and performing two transformations:   *   *   1. Let a _formatting position_ be a start of any `parts` string except the first one.   *      If a formatting position does not refer to a `%` character (which is assumed to   *      start a format specifier), then the string format specifier `%s` is inserted.   *   *   2. Any `%` characters not in formatting positions must begin one of the conversions   *      `%%` (the literal percent) or `%n` (the platform-specific line separator).   */  // The implementation is hardwired to `scala.tools.reflect.MacroImplementations.macro_StringInterpolation_f`  // Using the mechanism implemented in `scala.tools.reflect.FastTrack`  def f[A >: Any](args: A*): String = macro ???}

看到源码后,一切都明白了,例子

//s函数的应用val name = "James"s"Hello,$name" //Hello,Jamess"1+1=${1+1}"  //1+1=2

转载于:https://my.oschina.net/sucre/blog/651850

你可能感兴趣的文章
让虚拟机支持USB HDD 启动
查看>>
八数码问题
查看>>
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
查看>>
关于malloc的一个未解决的疑问
查看>>
java内存管理机制
查看>>
用R分析时间序列(time series)数据
查看>>
CCF201609-1 最大波动(100分)
查看>>
Vue-devtools 安装浏览器调试
查看>>
postman环境变量的设置
查看>>
百度--买帽子
查看>>
SDWebImage的使用
查看>>
PC端和移动端测试区别
查看>>
TCP/IP中的四元组、五元组、七元组
查看>>
用代码告诉你“问世间情为何物,直教人生死相许”
查看>>
(PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
查看>>
使用sqlite保存数据返回主键
查看>>
js循环生成多个easyui datagrid数据网格时,初始化表格
查看>>
Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器...
查看>>
获取用户信息
查看>>
洛谷P3952 时间复杂度
查看>>