colon `::`?
What is this double-colon ::
? Eg Foo::Bar
.
I found a definition:
The ::
is a unary operator that allows: constants, instance methods and class methods defined within a class or module, to be accessed from anywhere outside the class or module.
What good is scope (private, protected) if you can just use ::
to expose anything?
::
is basically a namespace resolution operator. It allows you to access items in modules, or class-level items in classes. For example, say you had this setup:
module SomeModule
module InnerModule
class MyClass
CONSTANT = 4
end
end
end
You could access CONSTANT
from outside the module as SomeModule::InnerModule::MyClass::CONSTANT
.
It doesn't affect instance methods defined on a class, since you access those with a different syntax (the dot .
).
Relevant note: If you want to go back to the top-level namespace, do this: ::SomeModule – Benjamin Oakes
This simple example illustrates it:
MR_COUNT = 0 # constant defined on main Object class
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # set global count to 1
MR_COUNT = 2 # set local count to 2
end
puts MR_COUNT # this is the global constant
puts Foo::MR_COUNT # this is the local "Foo" constant
Taken from http://www.tutorialspoint.com/ruby/ruby_operators.htm
::
Lets you access a constant, module, or class defined inside another class or module. It is used to provide namespaces so that method and class names don't conflict with other classes by different authors.
When you see ActiveRecord::Base
in Rails it means that Rails has something like
module ActiveRecord
class Base
end
end
ie a class called Base
inside a module ActiveRecord
which is then referenced as ActiveRecord::Base
(you can find this in the Rails source in activerecord-nnn/lib/active_record/base.rb)
A common use of :: is to access constants defined in modules eg
module Math
PI = 3.141 # ...
end
puts Math::PI
The ::
operator does not allow you to bypass visibility of methods marked private or protected.
上一篇: 任何良好的Android社区翻译工具?
下一篇: 冒号`::`?