Hello Ichihara.

Before

"I often use it in apps made with Rails ** I want to put my own methods in a separate file and use them where necessary **, but I don't know how to do it ..."

There was such a thing. I didn't understand ** class and module **, which seemed to be surprisingly known, so I summarized them in an article.

Roughly summarized, it looks like this.

Feature | how to use | Inheritance | instance | Superiority | |
---|---|---|---|---|---|

class |
A collection of data and methods | Read the file with require, then inherit and use it as an instance method | 〇 | 〇 | Since multiple classes are grouped together using inheritance, it can be used like a framework. |

module |
A collection of only methods and values | Read the file with reequire and then include,Used in extend | ✖ | ✖ | Collect data and use it where necessary, use it as a part |

class

class affects a wider range of objects through inheritance and instantiation.

`python`

```
class Formula
def pythagorean_theorem(a, b)
p "c = #{Math::sqrt(a**2+ b**2)}"
end
def self.quadratic_formula(a, b, c)
x1 = (- b +Math::sqrt(b*b -4*a*c))/ 2 * a
x2 = (- b -Math::sqrt(b*b -4*a*c))/ 2 * a
p "x is #{x1} and #{x2}"
end
end
```

`calc/calculate.rb`

```
#First read the file using require
require "calc/formulas"
#Inherit classes and inherit methods and data
class Hoge < Formula
attr_accessor :name
def initialize(name, age)
@name = name
@age = age
end
end
hoge = Hoge.new("hogehoge",22)
hoge.pythagorean_theorem(3, 4)
#-----------------------------------------------------------
"c = 5.0"
```

In the case of a class, first read the file using ** require **, let the class you want to use ** inherit **, and then ** create an instance **.

Therefore, it is suitable for ** inheriting a lot of data such as building MVC models and frameworks and linking each other **, but if you want to use it when you want to use data collectively, it will be described later. It can be said that ** module ** is more suitable.

module

Modules also have the role of grouping the same values and methods as class, but ** cannot create and inherit instances **.

Therefore, modules are easier to use than classes in terms of simply collecting information and calling it where it is needed.

There are two types ** to call module in class, ** include and extend **.

In a nutshell, include embeds module as ** instance method **, and extend embeds module as ** class method **.

In the following, ** math formulas are summarized as a module and called as an instance method. ** **

`calc/formulas.rb`

```
module Formula
#Three square theorem
def pythagorean_theorem(a, b)
p "c = #{Math::sqrt(a**2+ b**2)}"
end
#Solution formula
def quadratic_formula(a, b, c)
x1 = (- b +Math::sqrt(b*b -4*a*c))/ 2 * a
x2 = (- b -Math::sqrt(b*b -4*a*c))/ 2 * a
p "x is #{x1} and #{x2}"
end
end
```

`calc/calculate.rb`

```
#Read
require "calc/formulas"
class Hoge
attr_accessor :name
#Use include in class
include Formula
def initialize(name, age)
@name = name
@age = age
end
end
hoge = Hoge.new("hogehoge",22)
hoge.pythagorean_theorem(3, 4)
#---------------------------------------------------
"c = 5.0"
```

In this way, the instance generated from the Hoge class can use pythagorean_theorem, which is the Pythagorean theorem, as a ** instance method **.

Then, when I read it in the same way with extend ...

`python`

```
require "calc/formulas"
class Hoge
attr_accessor :name
extend Formula
def initialize(name, age)
@name = name
@age = age
end
def hello
p "Hello! I'm #{@name} "
p "I'm #{@age} old"
end
end
hoge = Hoge.new("hogehoge",22)
hoge.pythagorean_theorem(3, 4)
#--------------------------------------------------------------------
calculate.rb:26:in `<main>': undefined method `pythagorean_theorem' for #<Hoge:0x000000000504a3a8 @name="hogehoge", @age=22> (NoMethodError)
```

And you can see that the generated instance cannot use the method of module.

`python`

```
Hoge.pythagorean_theorem(3, 4)
#----------------------------------------------------------------
"c = 5.0"
```

You can use it by calling it as a ** class method **.

By the way, since the module is expanded in the class, you can use the instance method and class method in the class that inherits it **, respectively.

The following inherited the class using include.

`python`

```
class Fuga < Hoge
end
fuga = Fuga.new("fugafuga",20)
fuga.quadratic_formula(1, 3, 2)
#----------------------------------------------------------------
"x is -1.0 and -2.0"
```

If you want to use only ** methods directly without incorporating them into the class, you can use ** module method **.

`python`

```
module Formula
def pythagorean_theorem(a, b)
p "c = #{Math::sqrt(a**2+ b**2)}"
end
def quadratic_formula(a, b, c)
x1 = (- b +Math::sqrt(b*b -4*a*c))/ 2 * a
x2 = (- b -Math::sqrt(b*b -4*a*c))/ 2 * a
p "x is #{x1} and #{x2}"
end
# module_function +Define module method by method name
module_function :quadratic_formula
end
```

`python`

```
#Can be called in the same way as a class method
Formula.quadratic_formula(1, 8, 12)
#---------------------------------------------------
"x is -2.0 and -6.0"
```

As you can see, module is not necessary until ** class is created, but it can be used if you want to add a little function **.

It is preferable to use module if you just want to organize the data, and class if you want to embed the data in a part of the app using inheritance.

Recommended Posts