問題タブ [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.
groovy - この groovy マップで containsKey() の呼び出しが失敗するのはなぜですか?
これらの宣言で何かを台無しにしていると思いますが、次のように定義されたフィールドを持つグルーヴィーなクラスがあります。
私は次のように挿入します:
...そして後で、マップされていることがわかっているキーが存在するかどうかを確認すると、チェックは失敗します。
toString()
これを成功させる唯一の方法は、次のようにを呼び出すことです。
私はマップのジェネリック宣言を使用しているので、私の IDE は値の型のオートコンプリートを提供してくれるので、そこに型情報を保持したいと思います (と思います)。
String
キーの種類を からに変更しようとしましGString
たが、役に立ちません。[:]
マップの初期化を groovy の短縮形からに変更しようとしましたがnew LinkedHashMap<>
、これも役に立ちませんでした。
型情報を保持し、使用する必要を回避できるかどうかについてのアイデアはありますtoString()
か?
json - Groovy で Json 文字列を GString として解析する
List
s を含む GroovyのJson ファイルを解析しようとしていますString
。これらの文字列の一部にはフォーマットが含まれているため、これらを通常の s ではなく sGString
として解析したいと考えていました。GString
String
たとえばdescription
、次のメンバーには 1GString
と 7が含まれますString
。
(sの整形に慣れていないGString
ので、間違っているかもしれませんが、その場合はお詫びします)
Map
追加メンバー (上記の Json ファイルなど)"grenadeDamage"
の には、それぞれList
の への名前のマッピングが含まれます。これらは、次のようにレイアウトされたクラスに渡されます。
ここでの希望は、 が実行時に呼び出されたときに、 内のすべてGString
のList
を通常の に変換することです。String
getDescription()
与えられた例では、level
フィールドが 7 の場合、 の 5 行目description
に${variables}.get('grenadeDamage').get(${level})
値が入力される1d8
か、 の 7 番目の項目が入力されgrenadeDamage
ます。
これに関する問題はJsonSlurper
、Json ファイルを解析するために a を使用する場合、が直接description
として作成されることです。理想的には、タイプ as をすぐに強制せずList<String>
に解析したいと思います。description
String
コメント、アドバイス、建設的な批判は大歓迎です。
groovy - GString がその toString 表現を変更するとき
https://groovy-lang.org/closures.html#thisで Groovy クロージャーのドキュメントを読んでいます。GString の動作に関して質問があります。
- 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」です。
したがって、ここで変更すべきではないと思いますか?? 親切な助けをありがとう。