Scala文字列補間-StringContext

7684 ワード

STRING INTERPOLATION
概要
バージョン2.10.0以降、Scalaはデータに基づいて文字列:文字列補間を生成する新しいメカニズムを提供しています.文字列補間により、使用者は、処理された文字列に変数参照を直接挿入できます.次の例を示します.
val name="James"
println(s"Hello,$name")//Hello,James

前の例では、s"Hello,$name"は処理対象文字列の字面であり、コンパイラはそれを追加します.処理される文字列の字面は「番号の前の文字で表記される(例えば、前例ではs).文字列補間の実装の詳細はSIP-11で全面的に説明されている.
使用法
Scalaは3種類の革新的な文字列補間方法を提供した:s,fとraw.
s文字列補間器
任意の文字列の前にsを付けると、列に直接変数を使用できます.この例を見たことがあります
val name="James"
println(s"Hello,$name")//Hello,James    ,$name       s             。                      name    ,        Hello,James。  s   ,                      。

 
文字列補間器は、任意の式を処理することもできます.例:
println(s"1+1=${1+1}")        1+1=2。           ${} 。

 
f補間器
任意の文字列の前にfを付けると、他の言語のprintf関数に似た機能を持つ簡単なフォーマット列を生成できます.f補間器を使用する場合、すべての変数参照にはprintf-style形式の文字列(%dなど)が続く必要があります.次の例を見てください.
val height=1.9d
val name="James"
println(f"$name%s is $height%2.2f meters tall")//James is 1.90 meters tall f          。         int          double  ,       。  :

val height:Double=1.9d
scala>f"$height%4d"
:9: error: type mismatch;
 found : Double
 required: Int
           f"$height%4d"
              ^ f       java         。   %       [Formatter javadoc]       。          %,           %s(  )  。

 
raw補間器
文字面値の文字を符号化しない以外は、raw補間器とs補間器は機能的に同じである.処理された文字列は次のとおりです.
scala>s"a
b
" res0:String= a b ,s
。 raw 。 scala
>raw"a
b
" res1:String=a
b
,raw 。

以上の3つの文字列補間器に加えて、使用者は補間器をカスタマイズすることができます.
高度な使い方
Scalaでは,処理されたすべての文字列の文字面値を単純に符号化変換した.コンパイラは、次のような文字列のフォント値に遭遇します.
id"string content"          StringContext   call(id)  。             。             , StringContext         ,                。   :

//  :          ,   AnyVal   。
//           
implicit class JsonHelper(val sc:StringContext) extends AnyVal{
  def json(args:Any*):JSONObject=sys.error("TODO-IMPLEMENT")
}

def giveMeSomeJson(x:JSONObject):Unit=...

giveMeSomeJson(json"{name:$name,id:$id}")       ,               JSON    。   JsonHelper          ,   JSON           。   ,                   ,    JSON  。

 
コンパイラが「{name:$name,id:$id」}」に遭遇すると、次の式に書き換えられます.
new StringContext("{name:",",id:","}").json(name,id)

 
暗黙クラスは次のように書き換えられます.
new JsonHelper(new StringContext("{name:",",id:","}")).json(name,id)

 
したがって,JSONメソッドは文字列のオリジナルフラグメントにアクセスでき,各式は値である.この方法の簡単なしかしまた人を惑わす例:
implicit class JsonHelper(val sc:StringContext) extends AnyVal{
  def json(args:Any*):JSONObject={
    val strings=sc.parts.iterator
    val expressions=args.iterator
    var buf=new StringBuffer(strings.next)
    while(strings.hasNext){
      buf append expressions.next
      buf append strings.next
    }
    parseJson(buf)
  }
}

 
処理された文字列の各部分はStringContextのメンバーです.各式の値はJSONメソッドのargsパラメータに入力されます.JSONメソッドはこれらの値を受け入れて大きな文字列を合成し,JSON形式に解析する.より複雑な実装により、合成文字列の操作を回避することができ、それは単純に原生文字列と式値を通じてJSONを直接構築するだけである.
制限
文字列補間は、現在モードマッチング文には適用されません.このプロパティはバージョン2.11で有効になります.
 
カスタム文字列補間関数
 
カスタム文字列補間関数:
package test.interpolator

/**
  *      :
  *
  * @author WangXueXing create at 19-5-3   9:54
  * @version 1.0.0
  */
case object StringU{
  implicit class SLStringContext(sc: StringContext) {
    def sl(args: String*):String = sc.parts.mkString(",")+" : "+args.mkString(",")
  }
}

 
カスタム補間関数を使用するには:
package test.interpolator

import test.interpolator.StringU._
/**
  *      :
  *
  * @author WangXueXing create at 19-5-3   9:57
  * @version 1.0.0
  */
object StringTest {
  def main(args: Array[String]): Unit = {
    val i = 23
    val j = "hello"
    val sss = sl"""24:${j}2424${i.toString}"""
    println(sss)
  }
}

 
出力結果:
24:,2424, : hello,23