1

Groovyチュートリアルでこのコードを見ました-

import groovy.sql.Sql
sql = Sql.newInstance( 'jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName', 'username', 'password', 'net.sourceforge.jtds.jdbc.Driver' )
sql.eachRow( 'select * from tableName' ) { println "$it.id -- ${it.firstName} --" }

そして、これは Groovy 式の最初の出現です ( a 内のすべてが${}、文字列ではなく式として評価されます)。私の質問は、この Groovy 式機能は実際に新しい機能を提供するのでしょうか? 古き良き文字列連結でできることは何もないように思えます。いいえ -

println it.id + " -- " + it.firstName + " --"
4

4 に答える 4

1

はい。それが彼らです。コードと変数を文字列に追加できることは、Groovy の機能GroovyですGroovy。Groovy の文字列は、テンプレートのようになります。

現在、Groovy文字列は (") 引用符で囲まれています。ただし、標準Java StringGroovyアポストロフィ (') で囲まれています。groovy の標準Java文字列には、変数参照やコードを含めることはできません。

コードが読みやすくなります。文字列連結の一部としてすべての「+」記号を見るJavaと、PITA になることがあります。

何をコーディングして読みたいですか:

println "$it.id -- ${it.firstName} --"

また

println it.id + " -- " + it.firstName + " --"

ローカル変数を使用すると、読みやすくなります。

グルーヴィー

def name = "some name"
def age = 30
def waist = 42
println "Did $name really have a size $waist waist at age $age?"

ジャワ:

String name = "some name";
int age = 30;
int waistSize = 42;
System.out.println("Did " + name + " really have a " + waist + " waist at age  " age + "?";
于 2013-11-01T03:03:22.987 に答える
1

それらを使ってできるもう 1 つのことは、少し怠惰なテンプレートとして使用することです。

def x = "abc"

// Closure expansion rather than variable
def s = "x: ${->x}"

// Prints 'x: abc'
println s

// Change x
x = 400

// Prints 'x: 400'
println s

純粋な文字列連結では、印刷関数を記述したり、連結コードを繰り返したりすることになります

"""また、複数行の文字列演算子 -- など-- と、次のstripMarginことを可能にするメソッドも忘れないでください。

def (name,age,sender) = [ 'Alice', 30, 'Tim' ]
println """Hello $name
          |
          |$age today? Congratulations!
          |
          |$sender""".stripMargin()

どちらが印刷されますか:

Hello Alice

30 today? Congratulations!

Tim

繰り返しますが、文字列の連結で行うことができますが、最終的にはより多くの入力とエラーが発生しやすくなります (imo)

于 2013-11-01T09:44:45.677 に答える
0

ここで受け入れられた回答により、はい、GString (つまり、1 つ以上の${<expr>}式を持つ二重引用符で囲まれた文字列) は単なる構文糖衣であるという結論に達したようです。(受け入れられた回答の最初の文を使用します:「はい。それが彼らです。」)

しかし、上記の tim_yates が指摘したように、遅延評価のため、それは間違っているようです。

上記を少し拡張すると、文字列内の 1 つ以上の式がクロージャである場合toString()、GString で が呼び出されたときにのみ評価されます。したがって、groovyconsole では次のようになります。

def stime = "The time is: ${-> new Date().getTime()}."
println stime
Thread.sleep(500)
println stime
時刻は 1384180043679 です。
時刻は 1384180044194 です。

毎回新しい文字列を作成せずに + でこれを行うにはどうすればよいでしょうか? (私が取り組んだ 2 つの Java プロジェクトでの答えは、この種のことを行うクラスを発明することでした。) これは、単なる構文糖衣Template.java以上のものがあることを示唆しています。または、おそらくそれは構文糖衣ですが、Java.lang.String や一般的な文字列ではなく、GString クラスの場合です。

もう一つの例:

def vals = ['a':42]
def tmpl = "The answer is ${-> vals.a}."
println tmpl
vals.a = 43
println tmpl
答えは42です。
答えは43です。

GString のこの機能が本当に好きかどうかはわかりません。私は文字列が不変であることに慣れています(Javaから来ています)。Groovy の文字列は (かなり) 違います。2 つの Groovy の「文字列」が同じインスタンスを参照する場合、それらは同じテキスト値を持つと想定できるように思われますが、それは正しくありません。

http://groovy.codehaus.org/Strings+and+GString (半分くらい)

于 2013-11-11T14:57:47.183 に答える