人の造りしもの

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

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

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

それは

愛だ

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

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

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です