今回はメタクラスを使って FieldElement にメソッド(クロージャ型のプロパティ)を追加します(一覧)。 追加するメソッドは、基本的に前回定義したカテゴリ・メソッドと同じように動作するものです(positive() も追加):
- 和演算、積演算に関する単位元 (0, 1) と等しいかどうかを評価する izZero(), isOne() メソッド
- 四則演算を行う plus(), minus(), div() メソッド (multiply() は定義されているので省略)
- 正符号 (+) の単項演算子に対応する positive() メソッド
FieldElement.metaClass.define{ isZero = { -> getField().getZero() == delegate } isOne = { -> getField().getOne() == delegate } plus = { arg -> add(arg) } minus = { arg -> subtract(arg) } div = { arg -> divide(arg) } positive = { -> delegate } }
使い方は同じ:
@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/') @Grab('org.waman.math:wamans-math:0.0.1') import org.apache.commons.math.complex.Complex WamansMath.enhance(CommonsMathPackage.MATH) def c0 = new Complex(0d, 0d) // 0 def c1 = new Complex(1d, 0d) // 1 def c2 = new Complex(1d, 2d) // 1+2i def c3 = new Complex(3d, 4d) // 3+4i // 零元、単位元の確認 assert c0.isZero() assert !c1.isZero() assert !c0.isOne() assert c1.isOne() // 加減乗除演算 assert c2 + c3 == new Complex(4d, 6d) assert c2 - c3 == new Complex(-2d, -2d) assert c2 * c3 == new Complex(-5d, 10d) assert c2 / c3 == new Complex(0.44d, 0.08d) // 正符号演算 assert +c2 == new Complex(1d, 2d)
前回と比べて、use キーワードを使わなくていい代わりに、メタクラスにメソッドを追加するための呼び出し (WamansMath...) が必要になります。
- 作者: 奥村晴彦,杉浦方紀,津留和生,首藤一幸,土村展之
- 出版社/メーカー: 技術評論社
- 発売日: 2003/05
- メディア: 単行本
- 購入: 2人 クリック: 44回
- この商品を含むブログ (58件) を見る