Groovy学習ノートの二——基礎文法

6896 ワード

一、語句      
    Grouvyの語句はJavaと似ていますが、いくつかの特殊なところがあります。例えば、文のセミコロンは任意です。行ごとに文がある場合は、セミコロンを省略できます。一つの行に複数の語句がある場合は、セミコロンで区切られます。
x=[1,2,3]println x=5;x=y+7 println xクラスメイトx=12
    また、returnキーワードは、方法の最後に選択されます。同様に、戻りタイプも選択可能である(デフォルトはObject)。
 
二、ダイナミックタイプ
    他のScriptのようにGrovyは明示的な宣言タイプを必要としない。Groovyでは、オブジェクトのタイプは、実行時に動的に発見され、これは、作成するコードの数を極端に削減します。Groovyでは、タイプは、値、属性、方法、およびクローズドパラメータ、リターン値のいずれに対しても有可能であり、与えられた値だけがそのタイプを決定する(もちろん、タイプの除外を宣言する)。たとえば:
//Groovy     
myStr = "Hello World"
    ダイナミックタイプを使用しているので、引き継ぐ必要がなくても多状態の機能が全部得られます。
 
class Song{ 
  Property length 
  Property name 
} 

class Book{ 
  def public name 
  def public author 
}
 
def doSomething(thing){ 
  println "going to do something with a thing named = " + thing.name 
}
 
    ここでは二つのGrovy類、SongとBookを定義します。この二つのクラスは一つのname属性を含んでいます。関数doSomethingは、一つのthingをパラメータとして、このオブジェクトのname属性を印刷しようとしますが、doSomething関数は入力パラメータの種類を定義していませんので、オブジェクトがname属性を含む限り、動作します。これにより、SongおよびBookの例は、doSomethingの入力パラメータとして機能することができる。
mySong = new Song(length:90, name:"Burning Down the House") 
myBook = new Book(name:"One Duck Stuck", author:"Phyllis Root") 
doSomething(mySong) //prints Burning Down the House 
doSomething(myBook) //prints One Duck Stuck 
def doSth=this.&doSomething 
doSth(mySong) 
doSth(myBook)
    例の最後に、doSomethingの関数ポインタdoSthも作成しました。最後の実行結果はdoSoemithingの呼び出しと同じです。
注目すべきは、Grouvy Betaとは違って、新しいJSR Grouvyクラスを使用する場合、クラス内のすべての変数はdefキーワードまたはprvate、protectedまたはpublicのような修飾子を加えなければなりません。もちろん、@Propertyキーワードでメンバー変数を宣言することもできます。Scriptの中では必要ありません。
 
三、文字列
    Grouvyの文字列は、ダブルクォーテーションとシングルクォーテーションを使用することができます。二重引用符を使うと、文字列に演算式を埋め込むことができます。Grouvyは、bashと似たような$文字列に任意のGrovy表現を含めることができます。
name="James" 
println "My name is ${name},'00${6+1}'" //prints My name is James,'007'
    Grouxvyはまた、「uXXXX」参照(ここでXは16進数)をサポートしており、特殊文字、例えば「u 0040」は「@」と同じ文字を表しています。
1、大きなテキスト
    大きなテキスト(HTMLやXMLなど)があると、エンコードしたくないです。Here-docs.here-docsを使って、フォーマット文字列を作成するのに便利な仕組みです。Pythonのような三重引用符(「」「)を先頭に三重引用符で結ぶ必要があります。
name = "James" 
text = ""“ hello there ${name} how are you today? ”"" 
assert text != null 
println(text) 
    Groovy-JSRでは、次のような複数行の文字列はサポートされません。個人的にはHere-docs機能と重複しているようです。
foo = “hello there how are things?” 
println(foo)
 2、文字列の操作
(1)contains文字列にサブ文字列が含まれているかどうか、'groovy'.contains('oo')はtrueに戻ります。
(2)countは文字列の中性子文字列の出現回数を返します。'groovy'.count('oo')は3を返します。
(3)tokenizeはセパレータによって文字列をサブストリングに分解し、'apple^bana^grap'.tokenize('^')は['apple'、'bana'、'grape']に戻る。
(4)減量操作'groovy'-'oo'は、結果として'grvy'である。
(5)乗り操作'oo'*3で、結果は'oooo'です。
 
四、Grovyの主要構造
    Grouvyの主な構造は、論理分岐、クラス、閉鎖などを含む。
1、論理分岐
(1)if-else文:
    GrouvyはJavaと同じif-else文を提供します。
x = false 
y = false 
if ( !x ) {
  x = true 
} 
assert x == true 
if ( x ) { 
  x = false 
} else{ 
  y = true 
} 
assert x == y
     Groovyも三元演算子をサポートします。
y = 5 
x = (y > 1) ? "worked" : "failed" 
assert x == "worked"
 (2)switch文
    Groovyのswitch文はJavaコードに対応していますが、より柔軟で、Grouvyのswitch文は様々な種類のswitch値を処理できます。様々なタイプのマッチングができます。
      a、case値は類名で、switch値に適合するのはクラス例である。
      b、case値は正規表現であり、switch値にマッチする文字列は正規表現と一致する。
      c、case値は集合であり、整合switch値はセットに含まれており、rangesを含む。
    上記以外に、case値とswitch値が等しいとマッチします。
x = 1.23 
result = "" 
switch ( x ) { 
  case "foo": 
    result = "found foo" // lets fall through 
  case "bar": 
    result += "bar" 
  case [4, 5, 6, ‘inList‘]: 
    result = "list" 
    break 
  case 12..30: 
    result = "range" 
    break
  case Integer: 
    result = "integer" 
    break 
  case Number: 
    result = "number" 
    break 
  default: 
    result ="default" 
} 
assert result == "number" 
     Switch文の動作原理:Switch文はcase値のマッチングを行う時、isCase(switch Value)方法を呼び出します。Grouvyは種類、正規表現、集合などの重載を提供します。カスタマイズされたマッチングクラスを作成し、ユーザー定義のマッチングタイプを提供するために、isCaseメソッドを追加します。
サイクル
1、whileサイクル:
    GroovyはJavaの同じwhileサイクルをサポートしていますが、現在はdoサイクルをサポートしていません。
 
x = 0 
y = 5 
while ( y-- > 0 ){ 
  x++ 
} 
assert x == 5
 2、forサイクル:
    Groovyのforサイクルはもっと簡単で、また各種の配列、集合、Map、範囲などと一緒に仕事ができます。これらの内容を後で詳しく紹介します。
 
// iterate over a range 
x = 0 
for ( i in 0..9 ) { 
  x += i 
} 
assert x == 45
 
// iterate over a list
x = 0 
for ( i in [0, 1, 2, 3, 4] ) { 
  x += i 
} 
assert x == 10

 // iterate over an array 
array = (0..4).toArray() 
x = 0 
for ( i in array ) { 
  x += i 
}
assert x == 10
 
// iterate over a map
map = [‘abc‘:1, ‘def‘:2, ‘xyz‘:3] 
x = 0 
for ( e in map ) { 
  x += e.value 
} 
assert x == 6

// iterate over values in a map 
x = 0 
for ( v in map.values() ) { 
  x += v 
}
assert x == 6
 
// iterate over the characters in a string 
text = "abc" 
list = [] 
for (c in text) { 
  list.add© 
} 
assert list == ["a", "b", "c"]
 
六、Grovyスクリプトを実行する
 
    Groovyスクリプトを作成するには、クラスは必要ありません。Mainエントリポイントは必要ありません。変数を宣言する必要もありません。また、def文で自分の関数を定義し、スクリプトでそれを使用することができます。
 
    多くのスクリプト言語のように、Grouvyは実行時に解釈され、コンパイルされていないコードは構築-実行期間に多くの利点を提供することができます。運転時のコンパイルはGrouvyを高速プロトタイプ設計、異なるユーティリティとテストフレームの理想的なプラットフォームにします。以下のコードで簡単にGrovyを実行できます。
 
    groovy Hello World.groovy
 
    分解器を利用してGrovyスクリプトを実行する以外に、Grouvyは2つの異なる解釈器Shellを提供し、すべての有効なGrouvy表現を交互に実行できるようにする。
 
groovysh起動コマンドShellを実行して、Grovy文を入力して直接を実行できます。
groovyConsoneを実行してSwing方式のGrouvyコンソールを起動します。これは簡単なGrouvyエディタです。
 
    Groovyスクリプトは、実際にはバイトコードレベルのJavaクラスです。したがって、groovycでGrovyスクリプトをコンパイルすることもできます。コマンドラインまたはAntでgroovycを使用してスクリプトのクラスファイルを生成することができます。これらのクラスは通常のjavaコマンドで実行できます。ただ、クラスパスパスバッグgroovy.jarとasm.jarだけです。wangwang