Issue #16832 has been updated by byroot (Jean Boussier).


>  why don't we see uninitialized constant `Shipit::Stack(id: integer, environment: string, ...)::Foo`?

Because `inspect` is called with `rb_protect` and fail in this context, so Ruby fallback to `rb_obj_as_string`.


> I feel calling name here is a hack

That's fair, I'm personally on the fence and as I said in my ticket, perhaps this shouldn't change.

But my point here is that here Ruby is looking to provide the class path, in that context it makes sense to look at the `name`. You have similar checks for `T_CLASS/T_MODULE` in other parts of ruby, such as `rb_profile_frame_classpath`.

So IMHO it's worth considering.



----------------------------------------
Feature #16832: Use #name rather than #inspect to build "uninitialized constant" error messages
https://bugs.ruby-lang.org/issues/16832#change-85437

* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
----------------------------------------
While debugging a bug in Rails (https://github.com/rails/rails/pull/37632#issuecomment-623387954) I noticed `NameError` calls `inspect` on the `const_get` receiver to build its error message.

The problem is that some libraries such as Active Record have been redefining `inspect` for years to provide human readable information, e.g.: 

```
>> Shipit::Stack.inspect
=> "Shipit::Stack (call 'Shipit::Stack.connection' to establish a connection)"
>> Shipit::Stack.connection; nil
>> Shipit::Stack.inspect
=> "Shipit::Stack(id: integer, environment: string, ...)"
```

Which makes for fairly unhelpful error messages:

```
>> Shipit::Stack.const_get(:Foo)
Traceback (most recent call last):
        2: from (irb):4
        1: from (irb):4:in `const_get'
NameError (uninitialized constant #<Class:0x00007fc8cadf2dd0>::Foo)
```

So perhaps it's Active Record that is at fault here, but from my understanding since the goal is to display the constant path that was requested, `name` is much more likely to return a relevant constant name.

Proposed patch: https://github.com/ruby/ruby/pull/3080



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>