自定义scala 字符串插值

前言

字符串插值是 scala 2.10.0 开始引入的一个新的概念,就是能够让用户在字符串中嵌入变量引用。

从而可以让用户用数据来构造字符串。

比如 s interpolator,允许直接在字符串中使用变量和计算表达式:

val name = "Ldpe2G"
println(s"Hello, $name")  // Hello, Ldpe2G
println(s"1 + 1 = ${1 + 1}") // 1 + 1 = 2

已经提供的interpolator还有f, raw等

参考:http://docs.scala-lang.org/overviews/core/string-interpolation.html

正文

下面我们来看看如何自定义一个字符串插值,比如,从一个字符串中找到所有的email地址,

虽然用字符串插值来实现这个功能可能是多此一举,写个函数就可以解决。我这里只是为了

举例如何自定义字符串插值。

import scala.language.experimental._

object EmailTest {

    def main(args: Array[String]) = {
  	  val email = "test@gmail.com,test@163.com:fakee3rerw@qq.com"
  	  //为StringContext添加了一个emails方法
  	  //见下面的 implicit class EmailHelper 
  	  val emails = emails"测试${email}测试" 
  	  emails.filter(!_.equals("")).foreach(println)
    }
  
  //email正则表达式,取自 http://tool.oschina.net/
   val emailR = """[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?""".r
    
   implicit class EmailHelper(val sc: StringContext) extends AnyVal {
      def emails(args: Any*): List[String] = {
          val strings = sc.parts.iterator
          val expressions = args.iterator
          val emails1 = (List[String]() /: strings)((acc, elem) => {
              val mats = emailR.findAllIn(elem) mkString(",") split(",") 
              acc ::: mats.toList
          })
          val emails2 = (List[String]() /: expressions)((acc, elem) => {
              val mats = emailR.findAllIn(sc.s(elem)) mkString(",") split(",") 
              acc ::: mats.toList
          })
         emails1 ::: emails2
      }
  }
  
}

代码解释:

下面一句代码:

emails"测试${email}测试"

被编译器重写为:

new EmailHelper(new StringContext("测试", "测试")).emails(email)

字符串插值和scala macro结合起来还可以实现很多功能。比如在编译时期判断字符串是否一个合法的email地址。

由于macro我还在学习中,等学习完了再写一篇博客。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈树义

从 HelloWorld 看 Java 字节码文件结构

很多时候,我们都是从代码层面去学习如何编程,却很少去看看一个个 Java 代码背后到底是什么。今天就让我们从一个最简单的 Hello World 开始看一看 J...

3827
来自专栏JetpropelledSnake

Python学习笔记之Python正则表达式指南

正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分...

901
来自专栏IMWeb前端团队

谈一谈CDN的JS,CSS文件加载出错主域名重试的问题

背景知识 【卡爷文章】CSS文件动态加载(续)—— 残酷的真相 浏览器 CSS/JS 加载能力测试表 css、js的相互阻塞 了解这些基础知识之后,我们再来谈谈...

1985
来自专栏梧雨北辰的开发录

Swift学习:构造器(下)

本篇主要介绍Swift中构造器的一些特殊用法 一、可失败的构造器 顾名思义,这是用于我们构造过程可能失败情况的构造器。失败的原因可能是给构造器传入无效的参数值,...

2437
来自专栏老马寒门IT

jQuery的ajax详解

jQuery内部也封装了对原生ajax请求的方法,可以很方便我们的对后台异步请求处理。

750
来自专栏java闲聊

# SpringBoot thymeleaf基本使用

1984
来自专栏JetpropelledSnake

Python入门之python可变对象与不可变对象

本文分为如下几个部分 概念 地址问题 作为函数参数 可变参数在类中使用 函数默认参数 类的实现上的差异 概念 可变对象与不可变对象的区别在于对象本身是否可变。 ...

2836
来自专栏liulun

Nim编码风格

介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,...

1998
来自专栏Laoqi's Linux运维专列

python3–python模块+(复习)

3897
来自专栏Android开发经验

es6中箭头函数学习的一个记录

1074

扫码关注云+社区