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


> In the case we exceed the limit, I think we could call rb_class_name() for Module/Class

IMO we should all that in priority over `inspect` as it's more likely to return an useful class path. 

> Such an arbitrary limit seems weird, maybe we should extend it to at least 100?

I actually submitted a PR to remove it entirely: https://github.com/ruby/ruby/pull/3090

> I guess maybe it's done that way so it avoids the printed error message to be longer than 80 chars in the terminal?

No, according to the changelog it was to prevent a buffer overflow. But I don't think it's an issue anymore, I tested with 4000 chars and it doesn't crash.

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

* 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>