__type__
определяется в object.c как:
static VALUE
rb_obj_type(VALUE obj)
{
return LONG2FIX(TYPE(obj));
}
, что в свою очередь зависит от функции rb_type
:
static inline int
rb_type(VALUE obj)
{
if (IMMEDIATE_P(obj)) {
if (FIXNUM_P(obj)) {
return T_FIXNUM;
}
if (FIXFLOAT_P(obj)) {
return T_FLOAT;
}
if (obj == Qtrue) {
return T_TRUE;
}
if (obj == Qundef) {
return T_UNDEF;
}
}
else if (!RTEST(obj)) {
if (obj == Qnil) {
return T_NIL;
}
if (obj == Qfalse) {
return T_FALSE;
}
}
return rb_objc_type(obj);
}
Определенно, оно просто возвращает числоэто соответствует идентификатору типа, как определено константами предкомпилятора T_FIXNUM, T_FLOAT и т. д.
Я бы сказал, что это действительно ограниченное использование для стандартных пользователей, хотя это может сделать ваш код более эффективным впроверка типов при написании расширений C.