2010年1月30日土曜日

Groovyの型付け、型変換。

Groovyは単体で使うスクリプト言語ではなく、Javaのツールという扱いなので、「Groovyのためのライブラリ」というものはあまりない。なにか難しい事をするときはJavaのライブラリをそのまま使う。
ただ、Groovyは動的型付けだけど、Javaは静的型付け。
Javaに引数を渡す所で、型がそれに合ってないとエラーになる。

以下は、JavaのCSV読み書きライブラリ、opencsvを使った例。
import au.com.bytecode.opencsv.*

def myList = [
["月曜日","火曜日","水曜日"],
["モスバーガーSセット","250円弁当","ジューシーハムサンド"],
[320,262,278]
]

def writer = new FileWriter(new File("/Users/kanemu/Desktop/myList.csv"))
def cwriter = new CSVWriter(writer)
cwriter.writeAll(myList)
cwriter.flush()

これを実行すると、こんなエラーが出る。
Exception thrown: java.util.ArrayList cannot be cast to [Ljava.lang.String;

java.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.lang.String;
at au.com.bytecode.opencsv.CSVWriter.writeAll(Unknown Source)
at ConsoleScript2.run(ConsoleScript2:11)

これは、こうすると上手くいく。
import au.com.bytecode.opencsv.*

def myList = [
["月曜日","火曜日","水曜日"],
["モスバーガーSセット","250円弁当","ジューシーハムサンド"],
[320,262,278]
]
myList2=[]
myList.each{myList2.push(it as String[])}

def writer = new FileWriter(new File("/Users/kanemu/Desktop/myList.csv"))
def cwriter = new CSVWriter(writer)
cwriter.writeAll(myList2)
cwriter.flush()

きっちりとそのメソッドが受け取る型に変換してやらないといけない。
とくに、Javaは配列とList(java.util.ArrayList、Groovyで使うList)の違いがはっきりしているので、そのへんスクリプト感覚で使っていると足をすくわれる。

型変換の基本は「変数 as 型」。
def a = 1
assert a.class == java.lang.Integer
//文字列にする
a = a as String
assert a.class == java.lang.String
//数値にする
a = a as Integer
assert a.class == java.lang.Integer

配列とListの例。toList()、toArray()が使える。文字列をふつうにSplitするだけだとStringの配列になってしまうので注意。
def str = "わたしは,24歳,です"

//StringのArrayにする
def strAry = str.split(/,/)
//注意:SplitだけならStringのArrayになる。
assert strAry.class == java.lang.String[]

//Listに変換する
def strList = strAry.toList()
assert strList.class == java.util.ArrayList

//Arrayにする
def strAry2 = strList.toArray()
assert strAry2.class == java.lang.Object[]

//StringのArrayにもどす
def strAry3 = strList as String[]
assert strAry3.class == java.lang.String[]

2010年1月6日水曜日

Illustratorのパステキストをパスに戻すスクリプト





選択したパステキストを、パスに戻すスクリプトです。
IllustratorCS3、MacOSX10.5.8環境にて動作確認。