Scala文字列補間-StringContext
7684 ワード
STRING INTERPOLATION
概要
バージョン2.10.0以降、Scalaはデータに基づいて文字列:文字列補間を生成する新しいメカニズムを提供しています.文字列補間により、使用者は、処理された文字列に変数参照を直接挿入できます.次の例を示します.
前の例では、s"Hello,$name"は処理対象文字列の字面であり、コンパイラはそれを追加します.処理される文字列の字面は「番号の前の文字で表記される(例えば、前例ではs).文字列補間の実装の詳細はSIP-11で全面的に説明されている.
使用法
Scalaは3種類の革新的な文字列補間方法を提供した:s,fとraw.
s文字列補間器
任意の文字列の前にsを付けると、列に直接変数を使用できます.この例を見たことがあります
文字列補間器は、任意の式を処理することもできます.例:
f補間器
任意の文字列の前にfを付けると、他の言語のprintf関数に似た機能を持つ簡単なフォーマット列を生成できます.f補間器を使用する場合、すべての変数参照にはprintf-style形式の文字列(%dなど)が続く必要があります.次の例を見てください.
raw補間器
文字面値の文字を符号化しない以外は、raw補間器とs補間器は機能的に同じである.処理された文字列は次のとおりです.
以上の3つの文字列補間器に加えて、使用者は補間器をカスタマイズすることができます.
高度な使い方
Scalaでは,処理されたすべての文字列の文字面値を単純に符号化変換した.コンパイラは、次のような文字列のフォント値に遭遇します.
コンパイラが「{name:$name,id:$id」}」に遭遇すると、次の式に書き換えられます.
暗黙クラスは次のように書き換えられます.
したがって,JSONメソッドは文字列のオリジナルフラグメントにアクセスでき,各式は値である.この方法の簡単なしかしまた人を惑わす例:
処理された文字列の各部分はStringContextのメンバーです.各式の値はJSONメソッドのargsパラメータに入力されます.JSONメソッドはこれらの値を受け入れて大きな文字列を合成し,JSON形式に解析する.より複雑な実装により、合成文字列の操作を回避することができ、それは単純に原生文字列と式値を通じてJSONを直接構築するだけである.
制限
文字列補間は、現在モードマッチング文には適用されません.このプロパティはバージョン2.11で有効になります.
カスタム文字列補間関数
カスタム文字列補間関数:
カスタム補間関数を使用するには:
出力結果:
概要
バージョン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