Ruby Issue Tracking System: Issueshttps://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112010-02-12T11:14:43ZRuby Issue Tracking System
Redmine Ruby master - Feature #2740 (Closed): Extend const_missing to pass in the nestinghttps://bugs.ruby-lang.org/issues/27402010-02-12T11:14:43Zwycats (Yehuda Katz)wycats@gmail.com
<p>=begin<br>
At the moment, it is impossible for const_missing to differentiate between these cases:</p>
<pre><code> class Foo::Bar
Baz
end
class Foo
class Bar
Baz
end
end
</code></pre>
<p>In Rails, we implement a class loading system that loads classes from the file system if they are not found. In the above case, Foo::Baz might be stored in app/models/foo/baz.rb. We would like to be able to use the same Ruby constant lookup logic when looking up classes from the file system.</p>
<pre><code> class Foo::Bar
Baz
end
</code></pre>
<p>Here, we should look in "app/models/foo/bar/baz.rb" and in "app/models/baz.rb" just as Ruby would search for Foo::Bar::Baz and then Object::Baz.</p>
<pre><code> class Foo
class Bar
Baz
end
end
</code></pre>
<p>Here, we should look in "app/models/foo/bar/baz.rb", then "app/models/foo/baz.rb", and finally "app/models/baz.rb" just as Ruby would search for Foo::Bar::Baz, then Foo::Baz, and then Object::Baz.</p>
<p>In order to achieve this, I propose that we extend the const_missing method to take an optional second parameter containing the nesting:</p>
<pre><code> class Foo
class Bar
def self.const_missing(id, nesting)
id == :Baz
nesting == [Foo::Bar] # first case
nesting == [Foo::Bar, Foo] # second case
end
end
end
</code></pre>
<p>This would allow people who wish to do their own custom constant loading (such as Rails) to do so in a way that is consistent with Ruby's own constant lookup. In order to avoid backward-compatibility issues, we can check the arity of the const_missing method, and only pass in the nesting if a second parameter was provided.<br>
=end</p>