上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Rubyの破壊的メソッド

Rubyには元のオブジェクトの内容も変更する「破壊的メソッド」と、変更しない「非破壊的メソッド」が存在します。
メソッドそのままで破壊的メソッドとなるものもありますが、メソッド名の最後に「!」が付くものも破壊的メソッドです。
そこで、String、Array、Hash各クラスでりようできるメソッドの中で「!」が付くメソッドをまとめてみました。

「Rubyは全てがオブジェクト」で書いたように、各クラスのメソッドを出力する「methods」メソッドを利用するとこんな感じです。

res = []
a = "" (Arrayクラス検証時:a = []、Hashクラス検証時:a = {})
# methodsメソッドの結果は配列なので、その配列をブロックで評価して、
#「!」を含むメソッドのみを抽出
a.methods.select{|x| x=~/!/}
p res


結果、以下のようになりました。

●Stringクラスで「!」の付くメソッド
["upcase!", "gsub!", "downcase!", "chop!", "capitalize!", "tr!", "chomp!", "swapcase!", "tr_s!", "succ!", "strip!", "delete!", "lstrip!", "squeeze!", "next!", "rstrip!", "slice!", "reverse!", "sub!"]

●Arrayクラスで「!」の付くメソッド
["map!", "shuffle!", "uniq!", "reject!", "compact!", "slice!", "sort!", "flatten!", "collect!", "reverse!"]

●Hashクラスで「!」の付くメソッド
["reject!", "merge!"]

●あと、各クラスで共通するprivateメソッドとして以下が出力されました。
["exit!", "chomp!", "sub!", "gsub!", "chop!"]

Integer●クラスにも一つありました
["power!"]
power!メソッドの動作を調べたところ、名前の通り「階乗」を算出するもののようですが、
a=2
a.power!(3) #=> 8
p a #=> 2
と、元の値は書き換えられていなかったので、この「!」は「破壊的メソッド」という意味ではないのかもしれません。

Ruby バージョン1.8.6の結果


こんな風にいろいろなことを手軽に調べられるのは面白いです。
「!」の付く破壊的メソッドが存在しているこれらのメソッドには、必ず「!」の付かない非破壊的メソッドが存在しているということになりますね。

※ただ、delete_ifなど、元から破壊的メソッドなものは、他の非破壊的メソッドとの区別が付かないため抽出できません。
関連記事

コメントの投稿

非公開コメント

プロフィール

星羽(榎田)

Author:星羽(榎田)
PHPエンジニアがRuby、PHPなどをいじった時の備忘録

最新記事
最新コメント
最新トラックバック
カテゴリ
スポンサードリンク
検索フォーム
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。