青山です。

On Wed, 1 Dec 1999 23:35:27 +0900,
ktokita / ma.neweb.ne.jp wrote:

> ruby> object_a="Hello world!\n"
> ruby> object_name="object_a"
> ruby> object={}
> ruby> object[object_name]=object_a
> ruby> print object[object_name]

Hash でいいなら、Ruby ではこれでもいいですね。

しかし、逆に Perl で書き直すと、

$object_a = "Hello world!\n";
$object_name = "object_a";
%object = ();
$object{$object_name} = $object_a;
print $object{$object_name};

この場合、$object_a の内容をコピーして保持していくため、候補が増えて行
くと %object が肥大していくという問題が。

では、Ruby のようにリファレンスで書き直すと、

$object_a = \"Hello world!\n";
$object_name = \"object_a";
$object = {};
${$object}{$$object_name} = $object_a;
print ${${$object}{$$object_name}};

ちょっと(かなり)書きにくい(読みにくい)ですね。

$object_a = \"Hello world!\n";
$object_name = \"object_a";
$object = {};
$object->{$$object_name} = $object_a;
print ${$object->{$$object_name}};

これだと多少ましでしょうか。しかし、Hash に -> 演算子というのもちょっ
と変ですし(意味は同じなのですが)、元の Ruby の例には遠く及びません。

変数の頭の記号でデリファレンスできるのは2段階程度では便利そうに見えま
すが、3段以上になってくると優先順位の {} 無しにはまともな動作をしなく
なり、かえってややこしくなるようです。

このややこしさに比較すれば、$$name 相当を eval(name) とするような程度
は十分に許せるというか、見やすいので良いと感じます。

-----
(特に意味無し。やはり Ruby が好きといいたかっただけ?  各言語が値ベー
スとリファレンスベースである事を横に置いて話しているので、実は比較にも
なっていない。)


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.j