LoginSignup
0
2

More than 1 year has passed since last update.

[Ruby]モジュールを使いこなしてみた。

Last updated at Posted at 2021-05-09

はじめに

現場の開発においてモジュールはかなり使う技術だと思います!
よく使うだからこそ、細かい使い方まで知っていることが開発スピードの向上や、他の人のコードの読解にも役立ちます。

モジュールについて

簡単に説明すると、「インスタンス化出来ないクラスのようなもの」です。
モジュール定義の中に、別のモジュールやクラスを定義したり出来るので、名前空間として利用できます。

module FooModule
  class FooClass
    ...
  end
end

FooModule::FooClass #=> FooModule::FooClass

特徴

  • インスタンスを生成出来ない
  • 継承する事は出来ない
  • 名前空間を作ることが出来る
  • モジュールのメソッドを、、
    • あるクラスのインスタンスメソッドとして取り込む
    • あるオブジェクトの特異メソッドとして取り込む
  • モジュール関数を定義して使う

クラスにモジュールを取り込む

モジュールに定義されたメソッドを、クラスのインスタンスメソッドとして取り込むことをMix-in(ミックスイン)と言います。

include

モジュールをクラスに取り込むにはincludeを使用します。
インスタンスメソッドとして取り込むので、メソッドのレシーバはインスタンスです。

module Hello
  def foo
    puts 'hello! foo!'
  end
end

class Sample
  include Hello
end

sample = Sample.new
sample.foo #=> 'hello! foo!'

prepend

モジュールのメソッドをクラスのインスタンスメソッドとして継承ツリーの下位に取り込みます。
前述のincludeと比べて、こちらの方がメソッドの実行順として優先されます。

module Foo
  def foo_method
    p 'foo_method!'
    super
  end
end

class Bar
  prepend Foo

  def foo_method
    p 'bar_class!!!'
  end
end

bar = Bar.new
bar.foo_method #=> "foo_module!!!", "bar_class!!!"

extend

モジュールに定義されたメソッドを、オブジェクトの特異メソッドとして取り込むこともできる。
extendにより、そのオブジェクトにだけ特定の振る舞いを与えることができます。

module Greet
  def greet(name)
    puts "hello! #{name}"
  end
end

class Sample
  extend Greet
end

sample = Sample.new
sample.greet('World') #=> 'hello! World'

モジュール関数

privateなインスタンスメソッドであると同時に、モジュールの特異メソッドであるメソッドのこと。

# 定義方法
module SampleModule
  def hello(name)
    puts "Hello #{name}"
  end
  module_function :hello #helloメソッドをモジュール関数とする。
end

# まとめて定義する方法
module SampleModule
  module_function #これ以下にメソッドを定義することでモジュール関数となる

  def hello(name)
    puts "Hello #{name}"
  end

  def greet(name)
    puts "Good Morning #{name}"
  end
end

モジュール関数の呼び出し方

#直接的にモジュールから呼び出す。
SampleModule.hello('Tanaka') #=> Hello Tanaka

#includeする。
include SampleModule
hello('Tanaka') #=> Hello Tanaka

終わりに

モジュールは奥が深いけど、確実に自分の武器になるので扱えるようになりたいものですね!
少しずつ頑張りましょう。。!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2