はじめてのgroovy

31
はじめての Groovy 初級 T.Yamamoto 2009/07/24 @Nagoya def speaker = new Cast(name:”T.Yamamoto”,version:”GN-2009-07-24”)

Upload: tsuyoshi-yamamoto

Post on 28-Jan-2015

761 views

Category:

Technology


0 download

DESCRIPTION

日本 Grails/Groovy ユーザーグループ名古屋支部 第2回勉強会

TRANSCRIPT

Page 1: はじめてのGroovy

はじめてのGroovy

初級

T.Yamamoto 2009/07/24 @Nagoya

def speaker = new Cast(name:”T.Yamamoto”,version:”GN-2009-07-24”)

Page 2: はじめてのGroovy

自己紹介名前:山本 剛 (やまもとつよし)

所属:株式会社ニューキャスト組版屋、印刷系Webアプリ開発など。案件は90%Grailsを使ってます。JGGUG(じぇいがぐ) 名古屋支部 担当です。「Grails徹底入門」9-11章を書きました。 Grails Acegi Pluginを最初に作った人。

ブログhttp://d.hatena.ne.jp/mottsnite/

Page 3: はじめてのGroovy

今回は、コードを書きながらゆるい感じに

Groovyを紹介できればと思っています。

Page 4: はじめてのGroovy

Groovyとは?GroovyはJVM用の動的言語。Javaとシームレスに統合

JavaのAPIがそのまま使える!言語仕様はJavaとほぼ同じ

ちがいゎ:動的な型付け。セミコロン等の省略。リスト、マップ、範囲、正規表現の特殊な構文。Javaクラスに便利な機能追加されてたり。など!

クロージャDSL - ドメイン固有言語メタプログラミング

Groovy is Java!

Page 5: はじめてのGroovy

インストール&ツールダウンロード

http://groovy.codehaus.org/Download解凍して環境変数設定

export GROOVY_HOME=/opt/groovyexport PATH=$GROOVY_HOME/bin:$PATH

付属ツールgroovy - 実行コマンドgroovyc - コンパイルgroovysh - シェル起動groovyConsole - GUIなコンソール起動java2groovy - 移行支援ツール

Page 6: はじめてのGroovy

Groovyのコードはこんな感じです。

def name='World'println "Hello $name!"

class Greet { def name Greet(who) { name = who[0].toUpperCase() +who[1..-1] } def salute() { println "Hello $name!" }}def g = new Greet('world') // create objectg.salute()

def list = ["Hello", "★", "World"]

list.each{ print it}

Page 7: はじめてのGroovy

ん?

Page 8: はじめてのGroovy

例えば、このようなJavaのコードimport java.util.Date;

public class Color { private Integer colorId; private String colorName; private String cyan; private String magenta; private String yellow; private String black; private String rgb; private String sysIpaddress; private Date sysLastmodified; private Integer sysUid; public Color(Integer colorId, String colorName, String cyan, String magenta, String yellow, String black, String rgb, String sysIpaddress, Date sysLastmodified, Integer sysUid) { this.colorId = colorId; this.colorName = colorName; this.cyan = cyan; this.magenta = magenta; this.yellow = yellow; this.black = black; this.rgb = rgb; this.sysIpaddress = sysIpaddress; this.sysLastmodified = sysLastmodified; this.sysUid = sysUid; } public Color() {} public Color(Integer colorId) { this.colorId = colorId;

} public Integer getColorId() { return this.colorId; } public void setColorId(Integer colorId) { this.colorId = colorId; } public String getColorName() { return this.colorName; } public void setColorName(String colorName) { this.colorName = colorName; } public String getCyan() { return this.cyan; } public void setCyan(String cyan) { this.cyan = cyan; } public String getMagenta() { return this.magenta; } public void setMagenta(String magenta) { this.magenta = magenta; } public String getYellow() { return this.yellow; } public void setYellow(String yellow) { this.yellow = yellow; } public String getBlack() {

return this.black; } public void setBlack(String black) { this.black = black; } public String getRgb() { return this.rgb; } public void setRgb(String rgb) { this.rgb = rgb; } public String getSysIpaddress() { return this.sysIpaddress; } public void setSysIpaddress(String sysIpaddress) { this.sysIpaddress = sysIpaddress; } public Date getSysLastmodified() { return this.sysLastmodified; } public void setSysLastmodified(Date sysLastmodified) { this.sysLastmodified = sysLastmodified; } public Integer getSysUid() { return this.sysUid; } public void setSysUid(Integer sysUid) { this.sysUid = sysUid; }}

Page 9: はじめてのGroovy

Groovyだと、こんな感じにできる。省略!

セミコロン自動なので省略!

ゲッタ・セッタコンストラクタ

自動 import!?

class Color { Integer colorId String colorName String cyan,magenta,yellow,black,rgb String sysIpaddress Date sysLastmodified Integer sysUid}

class Color { Integer colorId, sysUid String colorName,cyan,magenta,yellow,black,rgb,sysIpaddress Date sysLastmodified}

Page 10: はじめてのGroovy

自動 importされる物groovy.lang.*groovy.util.*java.lang.*java.util.*java.net.*java.io.*java.math.BigIntegerjava.math.BigDecimal

他にもあったかも・・

Page 11: はじめてのGroovy

動的型付け変数、プロパティ、メソッド等の引数、そしてメソッドの戻り値を型を”def”と宣言。変数の型が動的に決まります。

String name = 'World' ↓def name='World'

class Dog { def say(){ // ← “Garuuuuu” }}

Page 12: はじめてのGroovy

特殊な演算子a?:b - エルビス → a?b:cのbの部分の省略a?.b - セーフナビゲーション演算子 null回避a(*list) - 展開list*.a() - 展開ドットa.&b - aのメソッドbをクロージャとして参照a.@field - フィールド/属性値を指定

Page 13: はじめてのGroovy

数値数値

Groovyでの数値はすべてオブジェクト。リテラル宣言は以下な感じ。Integer 15Long 100L, 100l Float 1.23f, 4.56F Double 1.23d, 4.56D java.math.BigInteger 123g, 456G java.math.BigDecimal 1.23, 1.4E4, 2.8e4, 1.23g, 1.23G

Page 14: はじめてのGroovy

文字列def str = ‘もじ’str = “もじ ${str}“def str2 = '''もじ もじ'''str2 = """ ${str.size()}

$str もじもじ

"""

GString

Page 15: はじめてのGroovy

クロージャクロージャはスコープを持ったロジックのブロック。フィールドに代入したり、メソッドの引数にも使える。//クロージャを渡すメソッドdef someMethod(num,clo){ clo(num) }

//クロージャdef clo = { println "受け取った値 "+it }

def clo2 = {one,two="デフォ"-> println "受け取った値 ${one} と ${two}"

}clo 1 //クロジャ実行clo2 2,1 //クロジャ実行//メソッドに渡して実行someMethod(1,clo)someMethod(2,clo2)

クロージャのパラメータクロージャのパラメータ{ println it } 0個又は1個

{ -> println 300 } 0個{ a -> println a } 1個

{ a=2 -> println a } デフォルト値{ a,b -> println a+b } 複数{ int a -> println a } 静的型指定

Page 16: はじめてのGroovy

正規表現正規表現検索演算子 =~正規表現マッチ演算子 ==~正規表現パターン演算子 ~String

def pattern = "\\d{3}-\\d{4}" //郵便番号にマッチdef text = "633-0412" //郵便番号

println text ==~ pattern // "true" が出力される

def m = text =~ pattern println m.matches() // "true"が出力される

p = ~/\d{3}-\d{4}/m = p.matcher(text) println m.matches() // "true" が出力される

Page 17: はじめてのGroovy

リスト・マップ・範囲// List - リスト

def list = [ "英語",87,new Date()]assert list + list == list * 2

// Map - マップdef map = [ course:"英語", score:87,last:new Date()]assert map.course=="英語"assert map['score']==87

// Range - 範囲def katakana = 'ア'..'ン' //def score = 60..100assert score.contains(map.score)

Page 18: はじめてのGroovy

リスト[1,2,3] + [1] == [1,2,3,1][1,2,3] << 1 == [1,2,3,1][1,2,3,1] - [1] == [2,3]

[1,[2,3]].flatten() == [1,2,3] [1,2,3].reverse() == [3,2,1]

[1,2,3].collect{ it+3 } == [4,5,6][1,2,3,1].unique() == [1,2,3][4,2,1,3].findAll{it%2 == 0} == [4,2]

[1,2,3,4].sum() == 10[4,2,1,3].sort() == [1,2,3,4]//他にも色々あります....

 def list = [0,1,2]list[-1] == 2assert list[-1..0] == list.reverse() assert list == [list.head()] + list.tail()

//ループlist.each{println it}

Page 19: はじめてのGroovy

マップ

def map = [:]//初期化map.name="名前"

map['age']=20

println map['name']println map.age

map.each { entry -> println entry.key println entry.value } map.each { k, v -> println "$k $v" } for (entry in map) { println "$entry.key $entry.value" }

マップは、キーが整数ではなく任意の型になったリストのようなものです。構文は非常に似ています。

Page 20: はじめてのGroovy

範囲assert (0..10).contains(5)

assert (0.0..10.0).containsWithinBounds(3.5)

for (item in 0..10) { println item }

for (item in 10..0) { println item }

(0..<10).each { println it }

Page 21: はじめてのGroovy

File I/Odef file = new File('data.csv')//ファイル書きだしfile.withWriter('UTF-8'){ writer -> writer << '''科目,点数国語,90英語,78社会,75理科,65'''}

//内容テキストprintln file.text

//各行file.eachLine { line -> println line}

//各行をカンマで分けて配列にfile.splitEachLine(',') {list -> println list[0]}

Page 22: はじめてのGroovy

他にも便利な実装が色々

あるので詳しくは・・・

Page 23: はじめてのGroovy

GDKJavaを便利に使う機能が実装されています。

以下のサイトを参照http://groovy.codehaus.org/groovy-jdk/

Page 24: はじめてのGroovy

ビルダーGroovyコード中で木構造データを表現するための機能

import groovy.xml.*def page = new MarkupBuilder()page.html{ head {title 'Page title'} body { div { (1..5).each{n-> li "No.$n" } } }}

<html> <head> <title>Page title</title> </head> <body> <div> <li>No.1</li> <li>No.2</li> <li>No.3</li> <li>No.4</li> <li>No.5</li> </div> </body></html>

Page 25: はじめてのGroovy

メタプログラミングカテゴリ

ExpandoMetaClass

class IntCodec { static String encode(Integer self){self.toString()} static Integer decode(String self){self.toInteger()} }use(IntCodec){ 244.encode() "244".decode()}

Integer.metaClass.encode << {delegate.toString()}String.metaClass.decode << {delegate.toInteger()} 244.encode().decode()

Page 26: はじめてのGroovy

メタプログラミング//メソッド呼び出しのフック Integer.metaClass.methodMissing << { String name, Object args -> Math."$name"(delegate) } println 3.sin() println 3.cos()

Page 27: はじめてのGroovy

おまけ

Page 28: はじめてのGroovy

GAE/JとGroovy

Page 29: はじめてのGroovy

Gaelyk ゲーリック軽量Groovy GAE/Jフレームワーク

Google App Engineへのデプロイ用テンプレートGroovletsとGroovyテンプレートサーブレットで実装されていて、GAE SDKのいくつかが注入されたいたりします。

サンプルアプリを作ったので、コード見てみましょう。ついでにGaelykのコードリーディングも!

Page 30: はじめてのGroovy

参考資料Groovy イン・アクションGrails徹底入門DZone Groovy Refcardz 日本語版Groovy

http://groovy.codehaus.org/APIリンク集

http://grails.jp/links.html

Page 31: はじめてのGroovy

日本 Grails/Groovy ユーザーグループhttp://www.jggug.org/