今天花了點時間試著了解 Ruby Class/Object 的內部實現:

Ruby RObject and RClass

以及 singleton class 的創建機制:

eval.c -> eval.c: rb_extend_object
activate eval.c
    eval.c -> class.c: rb_singleton_class
    activate class.c
        class.c -> class.c: singleton_class_of
        activate class.c
            class.c -> class.c: rb_make_metaclass
            activate class.c
                class.c -> class.c: make_singleton_class
                activate class.c
                    class.c -> class.c: rb_class_boot
                    activate class.c
                        class.c -> class.c: rb_class_alloc
                        activate class.c
                        deactivate class.c
                    deactivate class.c
                    class.c -> class.c: rb_singleton_class_attached
                    activate class.c
                    deactivate class.c
                deactivate class.c
            deactivate class.c
        deactivate class.c
    deactivate class.c
    class.c --> eval.c
eval.c -> class.c: rb_include_module

借用 RHG 裡面的一張圖來說明 singleton class 跟 obj 及 original class 的關係:

從短短的 make_singleton_class 就可以看出 code 寫得很簡潔易懂,果然是裡外都很漂亮:

static inline VALUE
make_singleton_class(VALUE obj)
{
    VALUE orig_class = RBASIC(obj)->klass;
    VALUE klass = rb_class_boot(orig_class);

    FL_SET(klass, FL_SINGLETON);
    RBASIC(obj)->klass = klass;
    rb_singleton_class_attached(klass, obj);

    METACLASS_OF(klass) = METACLASS_OF(rb_class_real(orig_class));
    return klass;
}

更詳細的 Ruby 內部實現介紹可以參考這兩份簡報: