1

Scala 2.10以降、次の補間が可能です。

val name = "someName"
val interpolated = s"Hello world, my name is $name"

http://docs.scala-lang.org/overviews/core/string-interpolation.html#advanced_usageの「高度な使用法」セクションのscalaドキュメントで確認できるように、カスタム文字列補間を定義することも可能になりました。

さて、私の質問は...文字列の新しい補間を定義している暗黙のクラスの内部から、補間される変数名を含めて、補間の前に元の文字列を取得する方法はありますか?

言い換えれば、私は補間xを定義できるようにしたいのです。

x"My interpolated string has a $name"

補間内で$name部分を置き換えることなく、上記のように文字列を正確に取得できます。

編集:簡単に言うと、これを実行したい理由は、元の文字列を取得して別の文字列である国際化された文字列に置き換えてから、変数値を置き換えたいためです。これが、補間を実行せずに元の文字列を取得したい主な理由です。

前もって感謝します。

4

3 に答える 3

3

Scalaの文字列補間はその中の任意の式を処理できるため、フォーマット関数に渡す前に引数${}評価する必要があります。したがって、変数名に直接アクセスすることは設計上不可能です。Eugeneが指摘しているように、マクロを使用してプレーン変数の名前を取得することができます。ただし、これは非常にスケーラブルなソリューションではないと思います。結局のところ、任意の式を評価する可能性を失うことになります。たとえば、この場合はどうなりますか。

x"My interpolated string has a ${"Mr. " + name}"

マクロを使用して変数名を抽出できる場合もありますが、任意の式では複雑になる可能性があります。私の提案は次のとおりです。変数の名前が文字列補間内で意味のあるものである必要がある場合は、それをデータ構造の一部にします。たとえば、次のことができます。

case class NamedValue(variableName: String, value: Any)

val name = NamedValue("name", "Some Name")

x"My interpolated string has a $name"

オブジェクトはに渡されAny*ますxNamedValueしたがって、これで内で一致するxことができ、データ構造の一部である「変数名」に応じて特定のことを行うことができます。変数名を明示的に格納する代わりに、たとえば次のように型階層を利用することもできます。

sealed trait InterpolationType
case class InterpolationTypeName(name: String) extends InterpolationType
case class InterpolationTypeDate(date: String) extends InterpolationType

val name = InterpolationTypeName("Someone")
val date = InterpolationTypeDate("2013-02-13")
x"$name is born on $date"

繰り返しにxなりますが、サブタイプを照合し、InterpolationTypeタイプに応じて処理することができます。

于 2013-02-13T11:55:56.790 に答える
2

それは不可能のようです。文字列補間は、例を次のようにコンパイルするコンパイル機能のようです。

StringContext("My interpolated string has a ").x(name)

ご覧のとおり、その$name部分はすでになくなっています。https://github.com/scala/scala/blob/v2.10.0/src/library/scala/StringContext.scala#L1のソースコードを見ると、本当にはっきりしましたStringContext

于 2013-02-11T23:17:54.057 に答える
1

xをマクロとして定義すると、コンパイラーによって生成された脱糖のツリーを見ることができます(@EECOLORで示されています)。そのツリーでは、「name」引数はIdent(newTermName( "name"))として表示されるため、そこから名前を抽出できます。マクロの記述方法とツリーの操作方法については、docs.scala-lang.orgのマクロガイドとリフレクションガイドをご覧ください。

于 2013-02-12T13:49:55.093 に答える