問題タブ [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.
java - Groovyで「${str}」なしで文字列からGStringを作成する方法
私は、いくつかの式を格納するString
Java の変数 (たとえば、 ) を持っています。これは、ユーザー入力からの完全に動的な文字列であり、いくつあるかわかりません。str
GString
"SELECT ${path} path FROM dual"
${}
そして、現在のバインディングを使用しsql.rows()
て評価されたものでは使用したくありません。${path}
PreparedStatement
問題は:
- 何らかの形で変換
str
しないと、GString
がスローされます。しかし、それは安全ではなく、Groovy は警告を生成します (引用符を使用して削除する必要があります)。SQLException
PreparedStatement
'${path}'
PreparedStatement
- この方法に変換する
str
とGString
:sql.rows("${str}")
、Groovy は完全に間違った準備済みステートメントを使用しますが"?"
、もちろん、それは機能しません。ステートメントが必要です"SELECT ? path FROM dual"
。
問題は、 ?でラップせずにどうやって取得できるGString
かです。あるいは、 (only , not )の最初のレベルだけを評価するにはどうすればよいでしょうか? または、この問題を別の方法で解決するにはどうすればよいですか?String
"${}"
GString
str
path
ありがとうございました。
string - Groovy String 評価ランタイム
こんにちは、実行時に入力される文字列値があり、それを使用して別の文字列を作成したいと考えています。
したがって、value = "/www.stackoverflow.com" の場合、コンストラクトは "www.stackoverflow.com "と等しくなります
しかし、私がするとき
construct
は何らかのクロージャー名に等しいです。これの目的は何ですか?なぜクロージャ、GString を使用しても問題ないのですか? そして、クロージャーのみを使用すると何も起こらないのはなぜですか?
編集済み: このメソッド呼び出しから値が変更されました。
groovy - Groovy の GString の Elvis 演算子
そして私がそれを呼び出すとき:
次の結果が得られます。
クロージャーが返されるのにorが返さtrue
れない理由''
-somehting
reflection - GroovyでPOJOプロパティにアクセスする簡単な方法は?
私は groovy が初めてで、まだ自分のやり方を学んでいます。ドット表記を使用してgroovyでPOJOプロパティ値を取得する簡単な方法はありますか? たとえば、次の POJO があります。
Groovy では、次のように name フィールドの値を取得したいと考えています。
上記は機能しません。私はまだ Java の getter と setter を使用できることを知っていますが、次のように pojo の値を動的に取得できるようにしたいと考えています。
Javaリフレクションの使用を避けようとしています。助けてくれてありがとう!
groovy - マップで GString キーをアドレス指定する方法に異なる動作があるのはなぜですか?
公式ドキュメントで Groovy (2.4.4) 構文を調べているときに、識別子として GString を使用したマップに関する特別な動作に遭遇しました。ドキュメントで説明されているように、評価されていない GString オブジェクトのハッシュコードは、評価された GString と同じ表現を持つ通常の String オブジェクトとは異なるため、GString は (ハッシュ) マップ識別子としては悪い考えです。
例:
ただし、私の直感的な期待は、実際の GString 識別子を使用してマップ内のキーをアドレス指定すると、実際には値が配信されるというものでしたが、そうではありませんでした。
それが気になりました。そのため、この問題に関していくつかの提案があり、いくつかの実験を行いました。
(私は Groovy を初めて使用するので、その場でブレインストーミングを行っただけであることを覚えておいてください。問題の原因を調べようとした方法を読みたくない場合は、提案 #4 に進んでください)
提案#1。GString オブジェクトのハッシュコードは、何らかの理由で動作/実装されており、コンテキストまたは実際のオブジェクトに応じて異なる結果を提供します。
それはナンセンスであることがすぐに判明しました。
提案#2。マップまたはマップ アイテムの実際のキーに、期待される表現またはハッシュコードがありません。
マップ内のアイテム、キー、およびそのハッシュコードを詳しく調べました。
したがって、マップ内のキーのハッシュコードは GString ハッシュコードとは異なります。はっ!か否か。知っておくと便利ですが、マップ インデックス内の実際のハッシュコードをまだ知っているので、実際には関係ありません。インデックスに入れられた後に文字列に変換されたキーを再ハッシュしました。じゃあ他には?
提案#3。GString の equals-method には、不明または実装されていない動作があります。
2 つのハッシュコードが等しいかどうかに関係なく、マップ内の同じオブジェクトを表すとは限りません。これは、キー オブジェクトのクラスに対する equals メソッドの実装に依存します。たとえば、equals メソッドが実装されていない場合、ハッシュコードが同一であっても 2 つのオブジェクトは等しくないため、目的のマップ キーを適切にアドレス指定できません。だから私は試しました:
したがって、同じ GString の 2 つの表現はデフォルトで等しくなります。
試した他のいくつかのアイデアを飛ばして、この投稿を書く直前に試した最後のアイデアを続けます。
提案#4。アクセスの構文は重要です。
それは理解の真のキラーでした。私は前に知っていました: 2 つのマップ値にアクセスする方法は構文的に異なります。それぞれの方法には制限がありますが、結果は同じままだと思いました。さて、これが出てきました:
したがって、マップの get メソッドを使用すると、最初に期待した方法で実際の値を取得できます。
GStrings に関するこのマップ アクセス動作の説明は何ですか? (または、ここにどのような新人ミスが隠されていますか?)
お待ち頂きまして、ありがとうございます。
編集:私の実際の質問が明確に述べられていないことを恐れているので、ここに簡潔で簡潔なケースがあります:
このようなキーとして GString を持つマップがある場合
なぜこれは値を返すのですか
しかし、そうではありません
?
performance - Grails と Groovy では、(一重引用符で囲まれた) 文字列は GString よりも優れていますか?
Grails と Groovy では、単一引用符で囲まれた文字列は GStrings (${variable} 値の注入を許可する二重引用符で囲まれた文字列) とは異なるクラスであるため、${variables} が使用されている場合を除いて、単一引用符を使用する方が効率的ですか? 二重引用符が存在すると、通常の一重引用符で囲まれた文字列では必要のない文字列の解析が必要になると思います。したがって、${} の存在を探すための余分な時間から、ごくわずかなパフォーマンス ヒットが予想されます。
したがって、二重引用符を使用することに特別な利点がない限り、単一引用符の使用を奨励する規則を設けることは、一般的に有益であるように思われます。私は基地外ですか?
intellij-idea - IntelliJ IDEA で不要な GString 違反を修正
CodeNarc を使用してプロジェクトを分析すると、膨大な数のUnnecessaryGString
違反が発生します。
ALT+ENTERを押してオプションを選択することで、それらを1つずつ修正できConvert to String
ます。ただし、これは非常に面倒なプロセスです。
IntelliJ には、不要な GStrings をすべて Strings に置き換える自動修正はありますか? そうでない場合、自分で作成するにはどうすればよいですか?
現在、エラーが発生しやすい置換を から に使用し"([^$\n"]+)"(?!\()
てい'$1'
ます。より複雑なケース(エスケープなど)では、いくつかの誤検知が発生します。
dictionary - GroovyのGStringでMapが機能しないのはなぜですか?
次のスニペットではgString
、マップから取得できません。
一体どうしてそれが可能なのでしょうか?
アサーション メッセージは、Groovy に深刻な問題があることを明確に示しています。
なぜgroovyが辞書にいくつかの値を表示しないのと同じ質問ではありませんか? 最初の答えは次のとおりです。
GString インスタンスをキーとしてマップに追加し、String インスタンスを使用してそれらを検索しています。
この質問では、 を明確に追加GString
して取得しようとしていますGString
。
また、マップで GString キーをアドレス指定する方法に異なる動作があるのはなぜですか? また、GStringImpl で equals() および == を使用した場合の Groovy の異なる結果にも、答えはありません。私は何も変異させず、 と混合String
しませんGString
。