I'm currently learning the programming language Ruby and its web framework Ruby on Rails. There are some symbols that you often see in it.
::
← This is it.
Devise :: RegistrationsController
and ActiveHash :: Base
and ActiveRecord :: Migration
etc.From a beginner's point of view, this symbol was something I only thought about, "Don't look closely at class names." Of course, it makes sense.
This article will give you an overview.
By the way, "::" that I used without being conscious of it ← This is.
To understand it, we need to know the concept of namespace
.
So what is a namespace?
Simply put, it is the range for managing methods and variables''. Even with the same
speaking'', the words are different in the United States and Japan, and even with the same Taro
, one set and two sets of Taro are different people.
In this way, the namespace is a mechanism that specifies "where do the methods and variables belong?" So that conflicts due to the same name do not occur.
As you can see, ○○ :: △△
means ○○ belonging to △△
.
Device :: ResistrationsController
can be read as ResistrationsController
belonging to Devise.
Also, namespaces are divided by "class" or "module"
.
I won't go into detail here, but there are the following differences between classes and modules:
Regarding the points pointed out by @scivola I have made some corrections below.
So far, we have found that ::
means to call B belonging to
by using A :: B
.
Looking a little closer, ::
has two implications:
1.Calling constants belonging to a class module
2.Calling a method that belongs to a class module
Let's look at each example.
Let's call the constant PI belonging to the Math module, which is a built-in library of Ruby, and output the pi. (Reference: Ruby Reference | module Math )
call_pi.rb
puts Math::PI
Run this program.
terminal
% ruby call_pi.rb
3.141592653589793
I was able to output pi
.
Use this when referencing a constant.
As an aside, I'll try another form of calling for later examples. Try calling it with ". (Dot)" like calling a method.
call_pi.rb
puts Math.PI
When you run this program ...
terminal
% ruby call_pi.rb
Traceback (most recent call last):
math.rb:1:in `<main>': undefined method `PI' for Math:Module (NoMethodError)
The error is `` The method called PI is not defined in the Math module''. Since PI is a constant (value), not a method, you may get an error like this.
Next, let's look at an example of "method reference".
In this example, to see the benefits of having a namespace, let's write without a namespace first.
run.rb
def run
puts 'Run on 4 legs'
end
def run
puts 'Run on two legs'
end
run
run
Let's run this program.
terminal
% ruby run.rb
Run on two legs
Run on two legs
If you reuse the same method name run
, the method defined later will be referenced.
Now let's define these run
s separated by the Dog
Human
class.
run.rb
class Dog
def self.run
puts 'Run on 4 legs'
end
end
class Human
def self.run
puts 'Run on two legs'
end
end
Dog::run
Human::run
Let's run this program.
terminal
% ruby run.rb
Run on 4 legs
Run on two legs
A method along the namespace was referenced.
This is because by defining the class and using ::
, it is possible to specify the receiver and call it like Refer to Dog's run
.
By the way, in the case of this usage of ::
(method call), it can be replaced with ". (Dot)".
Specifically, it is as follows.
run.rb
(abridgement)
Dog.run
Human.run
terminal
% ruby run.rb
Run on 4 legs
Run on two legs
It turns out that it behaves the same as a class method call.
And if you use ::
as a "method call"
, you can specify more than just a class or module for the receiver.
For example, like this.
sample.rb
10::times { |i| puts i }
terminal
% ruby sample.rb
0
1
2
3
4
5
6
7
8
9
That's how to use ::
and what it means.
::
← This is a symbol that indicates where a method or variable dependsWhile Rails is useful, I find it surprisingly painful when trying to customize it myself. And most of the causes are `` I don't know the basics of Ruby''.
It's important to catch up in a short amount of time, but it's also important to sit down and understand the basics. I will try to keep the balance while learning.
Recommended Posts