人の造りしもの

大したネタではないのですが、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言語もやん!ってツッコミは今は置いておきましょう。
人がそれをそうと認識するタイミングなんてのは、人それぞれなんだからね。

気にしてないけど倫理感とか道徳観なんかも、誰かが作った考え方を半ば押し付けられている感じもありますね。
基本的には人様に迷惑とコーヒーはかけちゃいけないって事でいいんじゃないかと思います。
というか、世の中、ほとんど人が創ったものですね。

人が創ったもんじゃないって何だろうなぁと考えたら・・

それは

愛だ

っと、話が脱線しまくりんぐだ。たぶんリュック・ベッソンの映画を見たからだろう。
ということで。

今回のテーマだったはずの、「このメソッドはどんなコードだろう?」という話はどこにいった感が満載ですが、まぁまぁそんな感じで。
お時間です。さようなら。

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *