Idiosyncratic Ruby: Constant Visibility
source link: https://idiosyncratic-ruby.com/52-constant-visibility.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Constant Visibility
It is less common, but similar to methods, constants have a visibility attached to them. You have the choice between private and public, and you can also mark a constant deprecated!
Like with methods, the default visibility of a constant is public. Unlike methods, which have a lot of associated methods for metaprogramming, working with constants is easier:
Module.methods.grep /const/
=> [:const_get, :constants, :const_defined?, :const_set, :private_constant,
:public_constant, :deprecate_constant, :const_missing]
Module.private_methods.grep /const/
=> [:remove_const]
Besides some minor idiosyncrasies (like the visibility modifiers, which where introduced at a later time, refer to constants with constant, while the others just use const), their usage is straight forward.
Effects of Visibility Modifications
You must create a constant before you can modify its visibility. When a constant exists, you can use the class method private_constant
or deprecate_constant
to alter its behaviour. You can change private visibility back to the original state using the public_constant
method. You cannot "undeprecate" constants.
Public
This is the default behavior, the constant can be referenced from anywhere and shows up in the constants
list:
module Namespace
module Public
end
end
Namespace::Public # => Namespace::Public
Namespace.const_defined?(:Public) # => true
Namespace.constants.include?(:Public) # => true
Private
The constant cannot referenced via the ::
operator and does not show up in the constants list. They can still be accessed from within the namespace and via const_get
:
module Namespace
module Private
end
private_constant :Private
end
Namespace::Private # NameError: private constant Namespace::Private referenced
module Namespace
Private # => Namespace::Private
end
Namespace.const_defined?(:Private) # => true
Namespace.constants.include?(:Private) # => false
Namespace.const_get(:Private) # => Namespace::Private
Deprecated
This is an additional property, which is also stored in a constant's visibility flag. Whenever you reference it, it will output a ($VERBOSE level independent) warning:
module Namespace
module Deprecated
end
deprecate_constant :Deprecated
end
Namespace::Deprecated # => Namespace::Deprecated
# warning: constant Namespace::Deprecated is deprecated
Namespace.const_defined? :Deprecated # => true
Namespace.constants.include? :Deprecated # => true
More about Constants
More Idiosyncratic Ruby
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK