Issue #14382 has been updated by jeremyevans0 (Jeremy Evans).


nobu (Nobuyoshi Nakada) wrote:
> In the case it is accessed from an inherited class, the receiver class/module may differ from class/module which defines the constant as private.
> So I think that the hook method will need another parameter.

Can you please let me know which hook method needs another parameter?  Also, can you provide example code showing the problem, as I'm not sure I understand?

> And as a private constant is not accessible but not "missing", different name may be better.

Are you referring to calling a method other than `const_missing`?  Then it breaks the similarity with `method_missing`.  Do you think we should also change ruby so that `obj.foo` where `foo` is a private method should call a method other than `method_missing`?

----------------------------------------
Feature #14382: Make public access of a private constant call const_missing
https://bugs.ruby-lang.org/issues/14382#change-70134

* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Calling `obj.foo` where `foo` is a private method of `obj` calls `method_missing`. You would expect `klass::FOO` where `FOO` is a private constant of `klass` to call `const_missing`, but currently it doesn't.  This makes a small change so that `const_missing` will be called in such cases.
    
In addition to similarity to `method_missing`, the main reason for doing this is it offers a way to deprecate public constants.  Currently, if you have a public constant and want to make it a private constant, you can't do it without breaking possible callers.  With this patch, you can make it a private constant, then override `const_missing` in the class, and have `const_missing` print a deprecation warning and then return the value of the constant.

---Files--------------------------------
0001-Make-public-access-of-a-private-constant-call-const_.patch (2.68 KB)


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