問題タブ [gstring]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1262 参照

groovy - この groovy マップで containsKey() の呼び出しが失敗するのはなぜですか?

これらの宣言で何かを台無しにしていると思いますが、次のように定義されたフィールドを持つグルーヴィーなクラスがあります。

私は次のように挿入します:

...そして後で、マップされていることがわかっているキーが存在するかどうかを確認すると、チェックは失敗します。

toString()これを成功させる唯一の方法は、次のようにを呼び出すことです。

私はマップのジェネリック宣言を使用しているので、私の IDE は値の型のオートコンプリートを提供してくれるので、そこに型情報を保持したいと思います (と思います)。

Stringキーの種類を からに変更しようとしましGStringたが、役に立ちません。[:]マップの初期化を groovy の短縮形からに変更しようとしましたがnew LinkedHashMap<>、これも役に立ちませんでした。

型情報を保持し、使用する必要を回避できるかどうかについてのアイデアはありますtoString()か?

0 投票する
0 に答える
87 参照

json - Groovy で Json 文字列を GString として解析する

Lists を含む GroovyのJson ファイルを解析しようとしていますString。これらの文字列の一部にはフォーマットが含まれているため、これらを通常の s ではなく sGStringとして解析したいと考えていました。GStringString

たとえばdescription、次のメンバーには 1GStringと 7が含まれますString

(sの整形に慣れていないGStringので、間違っているかもしれませんが、その場合はお詫びします)

Map追加メンバー (上記の Json ファイルなど)"grenadeDamage"の には、それぞれListの への名前のマッピングが含まれます。これらは、次のようにレイアウトされたクラスに渡されます。

ここでの希望は、 が実行時に呼び出されたときに、 内のすべてGStringListを通常の に変換することです。StringgetDescription()

与えられた例では、levelフィールドが 7 の場合、 の 5 行目description${variables}.get('grenadeDamage').get(${level})値が入力される1d8か、 の 7 番目の項目が入力されgrenadeDamageます。

これに関する問題はJsonSlurper、Json ファイルを解析するために a を使用する場合、が直接descriptionとして作成されることです。理想的には、タイプ as をすぐに強制せずList<String>に解析したいと思います。descriptionString

コメント、アドバイス、建設的な批判は大歓迎です。

0 投票する
2 に答える
170 参照

groovy - GString がその toString 表現を変更するとき

https://groovy-lang.org/closures.html#thisで Groovy クロージャーのドキュメントを読んでいます。GString の動作に関して質問があります。

  1. GStrings のクロージャ

ドキュメントには次のように記載されていました。

次のコードを使用します。

コードは期待どおりに動作しますが、次を追加するとどうなりますか。

アサートが失敗することがわかります。これには 2 つの理由があります。

GString は、値の toString 表現のみを遅延評価します

GString の構文 ${x} はクロージャーを表すのではなく、GString の作成時に評価される $x への式を表します。

この例では、GString は x を参照する式で作成されます。GString が作成されるとき、x の値は 1 であるため、値 1 で GString が作成されます。アサートがトリガーされると、GString が評価され、toString を使用して 1 が String に変換されます。x を 2 に変更すると、x の値が変更されましたが、これは別のオブジェクトであり、GString はまだ古いオブジェクトを参照しています。

GString は、参照する値が変化している場合にのみ、その toString 表現を変更します。参照が変更されても、何も起こりません。

私の質問は、上記の説明に関するものです。コード例では、1 は明らかに値であり、参照型ではありません。このステートメントが true の場合、GString で 2 に更新する必要があります。

以下にリストされている次の例も、少し混乱しているように感じます (最後の部分)。Sam を変更して名前を Lucy に変更すると、今度は GString が正しく変更されるのはなぜですか?? 私はそれが変異しないことを期待しています?? 2 つの例で動作が大きく異なるのはなぜですか?

コメントに「今回は GString が正しく変更された」と記載されているのはなぜですか? 以前のコメントでは、言及したばかりです

GString が作成されたときは p の値であったため、文字列は引き続き Sam に評価されます。文字列が作成されたときの p の値は「Sam」です。

したがって、ここで変更すべきではないと思いますか?? 親切な助けをありがとう。