1

Idiosyncratic Ruby: Constant Visibility

 3 years ago
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.
neoserver,ios ssh client

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK