Rubyの破壊的メソッド

最近は仕事でCばっかり触っていますが、Ruby、独学はじめました(ぉ

学べば学ぶほど、なんて直感的に書ける言語なんだ、と感動してます。なるほど、これは確かに人を虜にする言語だなぁと。といっても、「Ruby素晴らしい、PHPゴミ」なんてのはやっぱり違うよなぁと改めて思っています。言語に優劣はない(ただしVB.NET、いやVB6よ、お前はダメだ)のだから、適材適所で、というか自分が使いたい言語を使えばいいんじゃないのかなって。もちろん仕事となると話は別だけど。

っで、Rubyの勉強を始めて驚いたことは山ほどあります。配列ひとつを取っても「その発想はなかった」の連続であります。破壊的メソッドもそのうちのひとつ。それについて、RubyとPHPのソートで比較してみました。

a = [5, 8, 1, 9, 4, 2, 7, 3]
b = a.sort
p a             #->[5, 8, 1, 9, 4, 2, 7, 3]
p b             #->[1, 2, 3, 4, 5, 7, 8, 9]
a.sort!
p a             #->[1, 2, 3, 4, 5, 7, 8, 9]

メソッドsortを実行するだけでは、配列aの中身は変わりません。変わっているのは、配列aをsortした値を格納している配列b。ということは、「ここの処理ではソートして確認するだけで、実際のオブジェクトに変更を加えたくないなぁ」って時には破壊的メソッドの!を付けなければいいだけ。

ちなみに。

a = [5, 8, 1, 9, 4, 2, 7, 3]
b = a.sort!
p a             #->[1, 2, 3, 4, 5, 7, 8, 9]
p b             #->[1, 2, 3, 4, 5, 7, 8, 9]

もちろんこうなる。はわわ。

<?php
$a = array(5, 8, 1, 9, 4, 2, 7, 3);
$b = $a;

sort($a);

print_r($a);    // 1, 2, 3, 4, 5, 7, 8, 9
print_r($b);    // 5, 8, 1, 9, 4, 2, 7, 3

一方、PHPではsort()で処理してしまうと、引数に与えた配列の中身もゴソッと変えちゃう。なので、元の配列状態を維持しようものなら、書いているように別の配列を作ってそこに代入するしかない、のだと思う(自信ない)。

ともあれ、ビックリを付与して破壊的メソッドかどうかを判別するなんて面白いなぁと思ったものです。Perlを書いたことないので、unlessやuntilでさえ新鮮でした。買ったまま読んでいなかったリャマ本も引っ張りだすかー。