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


Ok, so after digging into it, it's not caused by an error, but by the length on the string returned by `#inspect`:

```ruby
module OK
  class << self
    def inspect
      "a" * 65
    end
  end
end

module BAD
  class << self
    def inspect
      "a" * 66
    end
  end
end

begin
  OK::A
rescue NameError => error
  p error.message
end

begin
  BAD::B
rescue NameError => error
  p error.message
end
```

```
"uninitialized constant aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::A"
"uninitialized constant #<Module:0x00007fdc0c8561d8>::B"
```

It's actually in the code:

```c
if (NIL_P(d) || RSTRING_LEN(d) > 65) { 
    d = rb_any_to_s(obj);
}
```

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

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