Thursday, July 26, 2007

第1回Grails コードリーディング!

第1回Grails コードリーディング参加ました!
とても楽しかったです。やっと、本格的にコミュニティが始動です。
色々な人があつまり、今後のGrailsに期待しつつ、
今後も皆さんで勉強会を続けられることを祈って。

そして、Google GroupのGrails-Japanを活用するのもきまり。
http://groups.google.com/group/grails-ja
※前からGoogle GroupのGrails-Japanに参加されている方も、
是非、次回は、ご参加ください!
次回は、8/24(金)です。

来月、題材として使用することになった、kakutani氏のhttp://kakutani.com/trans/ociweb/jnbFeb2004.htmlの翻訳をすこし修正してPDFにした、例のものは、以下の置いておきます。
http://groups.google.com/group/grails-ja/web/groovy-little-book.pdf
Grailsの内容を追記途中です、
また更新したらお知らせします。

Labels:

2 Comments:

At Mon Aug 13, 03:06:00 PM GMT+9, Anonymous Anonymous said...

PDF資料ありがとうございます。リファレンスはこちらに入っているんですね。資料に含まれるサンプルコードとかを動作させて気づいたところがありましたのでコメントいたします。
●P4

J2SDK 1.4 が必要
→J2SDK 1.4 以降が必要

●P6

Groovy のプロパティとメソッドのスコープはデフォルトではpublic であり、 Java のようにprotectedではない3。詳細は、後述するGroovy Bean のセクションを参照

→JSRでは、「デフォルトはpublicからprotectedに変わった」と書いてある(
http://groovy.codehaus.org/Migration+From+Classic+to+JSR+syntax
Default access level of class members)が、1.0実装ではpublicのままであるようだ(そのように動作する)。結論としてはこのままでよい。すみません。

●P7

JSR Groovyでは、変数の展開に限っては中括弧('{','}')が必ずしも必要では
なくなった。"${name}"ではなく、"$name"でも展開可能。この引き換えとして (?)、文字列定数中の$はクォートが必要となった(\$)。

●P7

今のGroovyでは、ダブルクォート1つだけでは、文字列中に改行を含められない。ダブルクォート3つなら、文字列中に改行を含めることができる。ヒアドキュメント(<<<EOS形式)は廃止された。
http://groovy.codehaus.org/Migration+From+Classic+to+JSR+syntax

●P8

JSR Groovyでは、正規表現定数として、/~/の形式を使用可能。例えば、ここにある例は変数patternやpの値について、

┏━
pattern = /\d{5}/ // 郵便番号にマッチ(5 桁)
text = /63304/ // 郵便番号
println text ==~ pattern // "true" が出力される
m = text =~ pattern
println m.matches() // "true" が出力される
// 次の例では、パターンはリテラル文字列でなければならない。
// 変数は使えない。
p = ~/\d{5}/
m = p.matcher(text)
println m.matches() // "true" が出力される
┗━

のようにも書ける(もとの例も間違いではない)。
エスケープが少なくてすむ(\\d→\d)ので、/~/の方がわかりやすいかも。

●P9
サンプルコード修正。
上のほう「a1;a2」は以下の様にdefをつけないとエラー。

def a1;def a2;

●P9

補足だが、整数除算の演算を行うメソッド、intdivが導入されている。オペレータには対応されない。(Classic Groovyでは\が整数除算演算子だったが廃止された)。

●P10
サンプルコード修正。
┏━
List myFind(List list, Closure closure) {
List newList = []
for (team in list) {
if (closure.call(team)) newList.add team
}
newList
}


class Team { def name; def wins; def losses }
teams = []
teams.add new Team(name:'Rams', wins:12 , losses:4)
teams.add new Team(name:'Raiders', wins:4 , losses:12)
teams.add new Team(name:'Packers', wins:10 , losses:6)
teams.add new Team(name:'49ers', wins:7 , losses:9)
winningTeams=myFind(teams){ it.wins>it.losses }
winningTeams.each{ println it.name }
┗━
修正点は、

・callの引数に括弧が必要。
・Teamのname,winsにdefが必要。
・myFindからdefを削除(あってもエラーではないが、必要ではない)

●P12

サンプルコード修正。
┏━
cars = [new Car(make:'Honda', model:'Odyssey'),
new Car(make:'Toyota', model:'Camry')]
println cars[1] // Camry を参照する
for (car in cars) { println car } // Car のtoString メソッドを呼び出す
class Car {
def make; def model
String toString() { "Car: make=${make}, model=${model}" }
}
┗━

修正点は、

・Carのmake,modelにdefが必要。


●P12

サンプルコード修正。
┏━
list = [1, 2, 3].asImmutable()
list.add 4 // groovy.lang.MissingMethodExceptionがスローされる
┗━
修正点は、
・immutable()メソッドはasImmutable()に変更された。

●P14

これは補足として、

players=['baseball':'AlbertPujols', 'golf':'TigerWoods']



players=[baseball:'AlbertPujols', golf:'TigerWoods']

とも書けて、意味も同じ。

●P14
最後の閉じ中括弧('}')が抜けている点を除き、特に問題ないが、
┏━
switch (x) {
case 'Mark':
println "got my name"
break

case 3..7:
println 'got a number in the range 3 to 7 inclusive'
break

case ['Moe', 'Larry', 'Curly']:
println 'got a Stooge name'
break

case java.util.Date:
println 'got a Date object'
break

case ~/\d{5}/:
println 'got a zip code'
break

default:
println "got unexpected value $x"
}
┗━
でも可。

●P17

サンプルコード修正。
┏━
factorial = [2, 3, 4, 5].inject( 1 ) {
prevResult , x -> prevResult*x
}
┗━

修正点は、

・|を->に修正。


●P19

サンプルコード修正。
┏━
w = new File('myFile.txt').newWriter()
┗━
newFileは「new File」に修正。newWriterはそのままで良い。

●P20
サンプルコード修正。
┏━
class Team{
String name
Person coach
def players=[]
}
class Person{
String name
}
def p = new Person( name:'MikeMartz' )
def t = new Team( name:'Rams', coach:p )
//次の行は、team.getCoach().getName と同じ結果を出力する
println "coach=${ t.coach.name }"
t = new Team( name:'Blues' )
//次の行はnull を返すのだが、
//NullPointerException は発生しない
println "coach=${ t?.coach?.name}"
//次の行はNullPointerException が発生する
println "coach=${ t.coach.name }"
┗━
修正点は、

・二回目のdef t = は二重定義エラーになるので、t = に修正。

●P21

サンプルコード修正。
┏━
def o=new CatchCall()
//次の行は"unknown method foo called with {"Mark", 19}"と表示する
println o.foo( "Mark" , 19 )

class CatchCall{
def invokeMethod( String name , Object args ) {
try{
return metaClass.invokeMethod( this , name , args )
} catch ( MissingMethodException e ){
//ここに確実に呼び出せるメソッド名と引数での呼び出しを
//行うロジックを書いてもよい
return " unknown method ${name} called with ${args}"
}
}
}
┗━
修正点は、

・invokeMethodにdefを指定。
・コメント中の出力メッセージが実際と微妙に違うので修正。

●P23

出力されるXMLの属性の順序(color=とyear=の順序)が違う
(意味があるかどうか不明)。
┏━
<autos>
<auto color='blue' year='2001'>
<make>Toyota</make>
<model>Camry</model>
</auto>
</autos>groovy.xml.MarkupBuilder@18385e3
┗━

●P24
実行してないですが、ヒアドキュメントを避けるとして

┏━
out.println '''<html>
<head>
<title>My Simple Groovlet</title>
</head>
<body>
<h1>My Simple Groovlet</h1>
<p>Today is ${new java.util.Date()}.</p>
</body>
</html>
'''
┗━

以上です。配布資料を修正した方が良いかどうかは、おまかせいたします。

ちなみにかくたにさんには利用をお断りになりましたでしょうか?返事があるかどうかは不確定ですが、私のほうからとあるSNS経由で聞いてみましょうか?
宜しくお願い致します。

 
At Mon Aug 27, 01:08:00 AM GMT+9, Blogger T.Yamamoto said...

いやぁ、すいません。
最近、いそがしすぎて、
自分のブロク確認してませんでした。

内容修正しておきます。
(全体的に仕切り直して書き直した方が良いかもしれないですね。)

 

Post a Comment

<< Home