要約
Groovy文法チートシート作ったよ
はじめに
CI/CDツールとして、20年以上前からあるにもかかわらず1、Jenkinsはいまだに現役ですね。Jenkinsおじさん、働きすぎですよ
プロジェクトにアサインされて、いきなりJenkinsを扱うことになった人もいるのではないでしょうか。はい、私がそうです。
(AWS CodePipeline とか使いたいけど、ベンダーロックインとかありますからね。サーバーホストしたいとかなると話は変わりますし。オープンソースで作りたい気持ちはわかる。これという代替があんまりない)
というわけで、Jenkinsコードに初めて対峙したわけですが、
書いてあることはわかるんだけど微妙に読みづらい。
だって知らない言語なんだもん。なに、Groovyって。
……え、これメンテナンスするんですか、私が?
前提
Jenkinsとは
jenkins公式ページ より
CI/CDツール。
パイプライン実行ファイルは Groovy で記述する。
MITライセンス(オープンソース)。おじさんはタダで働いてくれます
Groovyとは
Javaから派生した、Javaと親和性が良い言語(らしい)。
書き方はJavaと大きく異なる(Rubyライク)。
動的型付け、スクリプト言語機能、が大きな特徴。
最速理解Groovy文法チートシート
多少見づらいですがお許しください。
大前提
- 行末にセミコロン
;はつけなくてよい。(つけない) - 変数名はキャメルケースを用いる。
基本文法比較表
変数の宣言(動的型付け/静的型付け)
- Groovy
-
def x = "abc" // 動的型付け String y = "abc" // 静的型付け
-
- Java
-
// 動的型付けは無し String y = "abc"; // 静的型付け
-
- Ruby
-
x = "abc" # 動的型付け # 静的型付けは無し
-
- Python
-
x = "abc" # 動的型付け y: str = "abc" # 静的型付け
-
- C++
-
// 動的型付けは無し std::string y = "abc"; // 静的型付け
-
- JavaScript
-
let x = "abc"; // 動的型付け // 静的型付けは無し
-
定数の宣言
- Groovy
-
final int MAX = 100
-
- Java
-
final int MAX = 100;
-
- Ruby 2
-
MAX = 100
-
- Python
-
# サポート無し
-
- C++
-
const int MAX = 100;
-
- JavaScript
-
const MAX = 100;
-
文字列の連結と出力
- Groovy
-
println "My name is ${name}!"
-
- Java
-
System.out.println("My name is " + name + "!");
-
- Ruby
-
puts "My name is #{name}!"
-
- Python
-
print(f"My name is {name}!")
-
- C++
-
std::cout << "My name is " << name << "!" << std::endl;
-
- JavaScript
-
console.log("My name is " + name + "!");
-
配列(可変リスト)
- Groovy
-
def data = [1, 2, 3]
-
- Java
-
List<Integer> data = new ArrayList<>(List.of(1, 2, 3))
-
- Ruby
-
data = [1, 2, 3]
-
- Python
-
data = [1, 2, 3]
-
- C++
-
std::vector<int> data = {1, 2, 3};
-
- JavaScript
-
let data = [1, 2, 3];
-
連想配列(マップ)
- Groovy
-
def data = [1: "one", 2: "two", 3: "three"]
-
- Java
-
Map<Integer, String> data = new HashMap<>(Map.of(1, "one", 2, "two", 3, "three"))
-
- Ruby
-
data = {1 => "one", 2 => "two", 3 => "three"}
-
- Python
-
data = {1: "one", 2: "two", 3: "three"}
-
- C++
-
std::map<int, std::string> data = {{1, "one"}, {2, "two"}, {3, "three"}};
-
- JavaScript
-
let data = new Map([[1, "one"], [2, "two"], [3, "three"]]);
-
関数定義
- Groovy
-
def func1(x, y) { x + y }
-
- Java
-
int func(int x, int y) { return x + y; }
-
- Ruby
-
def func1(x, y) x + y end
-
- Python
-
def func1(x, y): return x + y
-
- C++
-
int func(int x, int y) { return x + y; }
-
- JavaScript
-
function func(x, y) { return x + y; }
-
無名関数(ラムダ式)
- Groovy
-
def f = { x, y -> x + y } - 「クロージャ」と呼ばれます。
(本来はラムダ式とは異なりますが、同じように使えます)
-
- Java
- 無し3
- Ruby
-
f = ->(x, y) { x + y }
-
- Python
-
f = lambda x, y: x + y
-
- C++
-
auto f = [](int x, int y) {<br> return x + y;<br>};
-
- JavaScript
-
const f = (x, y) => x + y;
-
重要な仕様
-
is()メソッドと==-
is()メソッドは、値ではなく、実体が同じであるかを返す。- Javaではこちらが
==。
- Javaではこちらが
-
==は、値が同じであれば true を返す。 - 例
def list1 = [1, 2, 3] def list2 = [1, 2, 3] def list1Copy = list1 println list1.is(list2) // false println list1.is(list1Copy) // true
-
-
falsyな値について
- 以下の値はすべて、if文ではfalseと判定されるので注意。
- false (bool値)
- 0 (数値)
- null
- "" (空文字)
- [] (空リスト)
- 以下の値はすべて、if文ではfalseと判定されるので注意。
-
文字列について
- シングルクォートとダブルクォートについて
- シングルクォート
''は文字列として扱われ、変数が展開されない。 - ダブルクォート
""も文字列として扱われるが、変数が展開される。
- シングルクォート
- トリプルクォートについて
- トリプルクォート
"""文字列""",'''文字列'''は、改行が保持される。
- トリプルクォート
- シングルクォートとダブルクォートについて
その他特殊な演算子
-
安全ナビゲーション演算子
?.- nullかもしれない値をチェインするときなどに利用。
- 例
def text = getText() // nullが返るおそれがある def length = text?.length()
-
エルビス演算子
?:- 三項演算子のtrueケースの省略。
- 値がfalsyな場合に別の値を代入するときなどに利用。
- 例
def text = getText() // nullが返るおそれがある def safeText = text ?: "blank-text"
-
宇宙船演算子
<=>- 比較した結果それ自体を返す。
- 数値同士の比較なら、0, 1, -1 のいずれかが返ってくる。
- 例
switch (a <=> b) { case 1: println "a is larger than b" break case 0: println "a is as same as b" break case -1: println "a is smaller than b" break }
- 比較した結果それ自体を返す。
-
正規表現マッチ演算子
==~- 正規表現にマッチしているかのbool値を返す。
- 例
def str = "asia" if (str ==~ /a.*a/) { println "matched!" }
-
正規表現検索演算子
=~- java.util.regex.Matcherオブジェクトを返す。
- 正規表現にマッチする箇所があるか検索するときなどに利用する。
- 例
def str = "abc123def" def matcher = str =~ /\d+/ if (matcher) { println "${matcher[0]} found!" // 123 found! と出力 }
- java.util.regex.Matcherオブジェクトを返す。
-
スプレッド演算子
*- リストを展開する。
- 例
def list = ["a", "b", "c"] def newList = ["1", *list, "2"] println newList // [1, a, b, c, 2]
-
スプレッドドット演算子
*.- リスト全体にメソッドを適用し、新しいリストを返す。
- プロパティーを取得するのにも使える。
- 例
def list = ["a", "b", "c"] def newList = list*.append("z") println newList // [az, bz, cz]
- リスト全体にメソッドを適用し、新しいリストを返す。
-
レンジ演算子
..- 指定した範囲のリストを作成するときに使う。
- 末尾を含めない
..<もある。
- 末尾を含めない
- 例
def list1 = 1..5 def list2 = 1..<5 println list1 // [1, 2, 3, 4, 5] println list2 // [1, 2, 3, 4]
- 指定した範囲のリストを作成するときに使う。
-
Javaフィールド演算子
.@- getXxx() という名のゲッターが存在している場合に、
そちらを参照せずに直接プロパティーを取得するために使う。- Groovyのドット演算子は、内部的にgetter/setterを呼ぶ仕組みになっている。
- 例
class C{ def field def getField() { return "value: ${field}" } } ins = new C() ins.field = 1 println ins.field // value: 1 println ins.@field // 1
- getXxx() という名のゲッターが存在している場合に、
おわりに
この記事が皆様の学習の一助になると嬉しいと思っております。
間違い等あれば、遠慮なくコメントなどでお教えください。
随時修正いたします。