大したネタではないのですが、Rubyには便利な標準ライブラリがあり、たくさんのメソッドがあります。
便利で良いのですが、Rubyでスクリプトを書いてるとこのメソッドはどんなコードだろう?という疑問に直面することが結構あります。
いまさら感はありますが、今回はその辺をざっくり探ってみます。
プログラミングの題材でSort関数を作ってみよう!ってのは最初の頃のネタとして良く取り上げられますが、今回このお題目にした原因になったのはDeleteメソッドからなので、Deleteメソッドを追いかけて行きませう
ベーシックな3つのクラス。
a = [1, 2] a.class => Array b = {1 => "a", 2 => "b"} b.class => Hash c = "hoge" c.class => String
そこにDeleteはあるのかい?
a.methods.grep(/delete$/) => [:delete] b.methods.grep(/delete$/) => [:delete] c.methods.grep(/delete$/) => [:delete]
あるようです。ではソースコードを見るためにRubyのソースを用意しました。
古いですけどベーシックに使っている2.0系でし。
$ ls -d /tmp/ruby-2.0.0-p645 [/tmp] /tmp/ruby-2.0.0-p645
ソースなので、皆様こちらにご揃いにございます。
$ pwd /tmp/ruby-2.0.0-p645 $ ls string.c string.c $ ls hash.c hash.c $ ls array.c array.c
Stringクラスで確認していきたいと思います。理由はStringクラスのDeleteを使ってたから!
5606行目に使い方のコメントを発見しました。これだよこれ!
5606 * "hello".delete "l","lo" #=> "heo" 5607 * "hello".delete "lo" #=> "he" 5608 * "hello".delete "aeiou", "^e" #=> "hell" 5609 * "hello".delete "ej-m" #=> "ho"
コードはこんな感じ。
5612 static VALUE 5613 rb_str_delete(int argc, VALUE *argv, VALUE str) 5614 { 5615 str = rb_str_dup(str); 5616 rb_str_delete_bang(argc, argv, str); 5617 return str; 5618 }
ザーッとソースを見ていくと、似たようなやつがこんなとこもあります。
あのChompだったり
5612 static VALUE 5613 rb_str_delete(int argc, VALUE *argv, VALUE str) 5614 { 5615 str = rb_str_dup(str); 5616 rb_str_delete_bang(argc, argv, str); 5617 return str; 5618 }
Upcaseとか。
4848 static VALUE 4849 rb_str_upcase(VALUE str) 4850 { 4851 str = rb_str_dup(str); 4852 rb_str_upcase_bang(str); 4853 return str; 4854 }
リファクタリングされているのですね。
1行目の”rb_str_dup”をザーッと見るとHeapとかAllocとか書いてるので領域の確保かなぁ。
2行目が今回の目的の部分です!
ふむふむ。
・・・
ザーッと見ましたが、そんなにリーディングスキルがなかったことを思い出したので、だいたい読んだとこで終わります。
static VALUE rb_str_delete_bang(int argc, VALUE *argv, VALUE str) { char squeez[TR_TABLE_SIZE]; rb_encoding *enc = 0; char *s, *send, *t; VALUE del = 0, nodel = 0; 〜〜〜 略 〜〜〜
短っ!と思うかもしれませんが、紙面の都合上この辺にしておきます。
ただこうしてCのソースを眺めてたら、これがRubyなんだなぁと、Rubyも人が作ったものなんだなぁと改めて実感した。
ってかC言語もやん!ってツッコミは今は置いておきましょう。
人がそれをそうと認識するタイミングなんてのは、人それぞれなんだからね。
気にしてないけど倫理感とか道徳観なんかも、誰かが作った考え方を半ば押し付けられている感じもありますね。
基本的には人様に迷惑とコーヒーはかけちゃいけないって事でいいんじゃないかと思います。
というか、世の中、ほとんど人が創ったものですね。
人が創ったもんじゃないって何だろうなぁと考えたら・・
それは
愛だ
っと、話が脱線しまくりんぐだ。たぶんリュック・ベッソンの映画を見たからだろう。
ということで。
今回のテーマだったはずの、「このメソッドはどんなコードだろう?」という話はどこにいった感が満載ですが、まぁまぁそんな感じで。
お時間です。さようなら。