Где сообщение об ошибке ArgumentError: идентификатор не указан при вызове method_missing

Когда вы звоните method_missing с первым параметром как 'string' вместо :symbol вы получаете это загадочное сообщение об ошибке:

BasicObject.send(:method_missing, 'any-method')
ArgumentError: no id given
from (pry):3:in `method_missing'

Когда вы смотрите на исходный код для method_missing

static VALUE
rb_method_missing(int argc, const VALUE *argv, VALUE obj)
{
    rb_thread_t *th = GET_THREAD();
    raise_method_missing(th, argc, argv, obj, th->method_missing_reason);
    UNREACHABLE;
}

нет ничего с сообщением об ошибке ArgumentError: no id given, Откуда это?

1 ответ

Решение

raise_method_missing() вызывает этот аргумент ошибки:

static void
raise_method_missing(rb_thread_t *th, int argc, const VALUE *argv, VALUE obj,
                     int last_call_status)
{
    // ...
    if (argc == 0 || !SYMBOL_P(argv[0])) {
        rb_raise(rb_eArgError, "no id given");
    }
    // ...
}
Другие вопросы по тегам