Ruby のメソッド呼び出し

作成日: 2003-08-13
最終更新日:

Ruby とメソッド呼び出し

Ruby では関数という概念がなく、すべてメソッド呼び出しという概念でまとめられている。

あるメソッドがどのクラスに属するかは、体系的にまとめられている。 以下はあまり体系的ではない、落ち穂拾いだ。

絶対値をとるabsメソッドは、Java では Math クラスにある。 すなわち value = Math.abs(original)と計算する。 一方、Ruby では abs メソッドは Numeric クラスにある。 この場合は、オブジェクトが Numeric クラスに属していれば、value = original.abs とすることができる。両者を比べると、Ruby の記述が読み易いと思う。

では、メソッド呼び出しで失敗した例をさらそう。 「n 次元の単位球上のランダムに分布する点座標の配列を作る」 という問題を解くときのことだ。まず v という配列に一様乱数を入れて、 それを表示することにした。r は配列をベクトルと見たときのベクトルの大きさの2乗である。

	r = 0.0
	v.each { |val|
		val = 2.0 * rand - 1.0
		r += val * val
	}
	p v

ところが、v の要素を表示させても、nil ばかりだ。メソッドを確認したところ、 もとの配列を書き換えるのは collect! あるいは map! メソッドであることがわかった。 そこで次のように変更した。

	r = 0.0
	v.map! { |val|
		val = 2.0 * rand - 1.0
		r += val * val
	}
	p v

今度は v の要素が表示された。しかし、様子がおかしい。 配列がすべて正数であり、おまけに昇順になっている。 配列には[-0.5, 0.5)で一様な分布の数が入っていなければならないはずだ。

map! の説明を見ると、 「ブロックを適用した結果で各要素がおきかえられる」とある。 ということは、 r += val * val の結果によって各要素が置き換えられたということだ。 なるほど、これで、要素がすべて正でしかも昇順になっている理由がわかった。 こうすればいい。

	r = 0.0
	v.map! { |val|
		val = 2.0 * rand - 1.0
		r += val * val
		val
	}
	p v

まりんきょ学問所Rubyの浮き輪 > メソッド呼び出し


MARUYAMA Satosi