Wed, January 27, 2010
条件判定にクロージャを利用(改良版) groovy
昨日クロージャを使った条件判定についてエントリー書いたのですが、 その後、この方法より多少はよいと思われる別の書き方を思いついたのでメモ。
問題
たとえば、無数の点が平面上に存在していて、 その点について考える場合。
前回のエントリーとの違いは、2つの点の関係だけでなく、1つの点だけを考える場合も あるだろう、ということを考慮しています。つまり問題を一般化した、というか。 (ま、たいした話じゃないですけど)
たとえば、ある領域に点が含まれるかを判定するクロージャ
コード mypoint1.groovy
import java.awt.*
class MyPoint extends Point {
def を調べる( Closure c ){ c.call(this) }
}
def pt0 = new MyPoint(x:9,y:9)
def pt1 = new MyPoint(x:12,y:12)
def この領域に入っているか = {
def area = new java.awt.Rectangle( new Point(10,10),new Dimension(10,10) )
area.contains( it )
}
// テスト1
println 'pt0がこの領域に入っているか? -> '+ pt0.を調べる( この領域に入っているか )
println 'pt1がこの領域に入っているか? -> '+ pt1.を調べる( この領域に入っているか )
実行
$ groovy mypoint1.groovy
pt0がこの領域に入っているか? -> false
pt1がこの領域に入っているか? -> true
次に2つの点の距離が近いかを判定するクロージャ
コード mypoint2.groovy
import java.awt.*
class MyPoint extends Point {
def を調べる( Closure c ){ c.call(this) }
}
def pt0 = new MyPoint(x:9,y:9)
def pt1 = new MyPoint(x:12,y:12)
def 次の点との距離は近いか = { p->
{ anotherP->
Math.sqrt( Math.pow(p.x-anotherP.x,2) + Math.pow(p.y-anotherP.y,2) ) < 10
}
}
// テスト
println 'pt0とpt1の距離は近いか? -> '+ pt0.を調べる( 次の点との距離は近いか )( pt1 )
2つの点を比較するので、を調べる メソッドをオーバーロードして引数にMyPointをとるように変更するのではなくて (というのが前回の発想ですが) を調べるメソッドはそのまま変更しません。
これだと2つ目の点を調べられないので、次の点との距離は近いか というクロージャは クロージャを返すようにしておきます。(ここがミソ...)
そうすれば、以下のように...
pt0.を調べる( 次の点との距離は近いか )( pt1 )
指定することで、pt0 と pt1 の関係を調べることができます。