0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby moduleの特異メソッドとして取り込む

Posted at

moduleとは

クラスによく似た機能であり、任意の式メソッドを定義できます。
クラスとの大きな違いは

  • インスタンスを生成できない
  • 継承できない

また、用途はいくつかありますが、特異メソッドの取り込み方についてまとめていきます。

moduleに特異メソッドを定義

モジュールには特異メソッドを直接定義することができます。selfをメソッド名の前につけて定義します

module A
  def self.foo
    puts "hello"  
  end
end

A.foo # => hello

このように、moduleで定義したものは特異メソッドとなります。

classへ特異メソッドを追加する

特定のclassへmoduleから特異クラスを追加する場合、class拡張する(classのスコープに入る)必要があります。

  • 特異メソッドは特異クラスへ定義する必要がある
  • 特異クラスはクラスの裏に隠れている

2つめは抽象的な表現ですが、クラスには特異クラスがセットで存在して、特異メソッドを定義するにはclass << selfという構文が必要だと大まかに理解しておきます。

module Bar
    def bar
      puts "hello"
    end
end

class Baz
    class << self
      include Bar
    end
end


p Baz.singleton_methods # => [:bar]

singleton_methodは特異メソッドを定義したものを調べることができます。
moduleを使用し、class << selfすることで特異メソッドが定義されていることがわかります。

ちなみにこれは、インスタンスオブジェクトにも使用可能です。

module MyModule
    def my_method
       puts "hello"
    end
end

obj = Object.new

class << obj
    include MyModule
end

obj.my_method         # => "hello"
obj.singleton_methods # =>[:my_method]

extendを使う

class << self構文は、extendを使用することで同様に書き換えることもできます。

module Bar
    def bar
      puts "hello"
    end
end

class Baz
    extend Bar
end


p Baz.singleton_methods # => [:bar]

extendを使用した時の方がコードが短くなる分描きやすそうですね!

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?