27
26

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 5 years have passed since last update.

rubyのmoduleメソッドの呼び出し方法

Last updated at Posted at 2016-11-06

Rubyの module は慣れ親しんできたVB.NETのModuleとは
大分違うようなので整理しておこうと思います。

##moduleのメソッドは関数として使えない
Rubyのmoduleのメソッドは普通に定義しただけじゃ、関数として使えない。

sample0.rb
module ModTest
  def sayHello
    puts "こんにちは"
  end
end
# sayHelloをmoduleの外から実行すると・・
ModTest.sayHello
#=> undefined method `sayHello' for ModTest:Module (NoMethodError)
# 呼び出せない・・

##moduleのメソッドを呼ぶ方法
moduleのメソッドを呼ぶには、以下の3つの方法がある。
###1. mixinを使う
別にclassを定義して、呼び出したい関数を含むmoduleをincludeする。
これがRubyで最も一般的なやり方らしい。
コードにするとこんな感じ。

sample1.rb
class ClsTest
  include ModTest
  # ModTestをmixinします
end
# インスタンスを作ってincludeしたmoduleのメソッドを呼び出す
cls = ClsTest.new
cls.sayHello
#=> こんにちは

###2. module_functionを使う
module_functionで関数として使いたいメソッドが指定できる。

sample2_1.rb
module ModTest
  def sayHello
    puts "こんにちは"
  end
  # 外部から関数として使いたいメソッドを指定します。
  module_function :sayHello
end
# sayHelloをmoduleの外から実行すると・・
ModTest.sayHello
#=> こんにちは

module_functionを実行すると以下の2つの処理が行われる。
 ・インスタンスメソッドのprivate化
 ・publicクラスメソッドの作成

なので、mixinでmodudleを取り込んだクラスから呼び出す為には、
スコープを public に戻してやる必要がある。

sample2_2.rb
module ModTest
  def sayHello
    puts "こんにちは"
  end
  module_function :sayHello
  # module_functionを使うとインスタンスメソッドがprivate化されてしまうので、
  # mixinでも使う場合は public に戻してやる。
  public :sayHello
end

class ClsTest
  include ModTest
end

cls = ClsTest.new
cls.sayHello
#=> こんにちは

ただ、こういうふうに無理やりスコープを Public に戻すのが
正しいのかわからないので、とりあえずこれは使わないようにする。

###3. クラスメソッドとして宣言する
ModuleもClassなので、当然クラスメソッドを定義できます。
だから、Classのクラスメソッドと同じようにこんな感じで定義可能です。

sample3.rb
module ModTest
  class << self
    def sayHello
      puts "こんにちは"
    end
  end
end

ModTest.sayHello

簡単ですね。

##まとめ
VB.NETにおける Module は関数定義を集めたもので、
ユーティリティ関数をまとめておくような使い方が一般的でした。
しかし、Rubyの module は主にクラス拡張の手段という感じですね。
~~だから、ここに書いた 2(module_functionを使う方法) や ~~
3(クラスメソッドとして宣言する) 方法はあまり使うべきではないのかもしれませんね。。

2、3に書いた方法でstatic method化することよくあるとコメントでご指摘頂きました。。
(ただし、module_function化したものを再度Publicにするのは駄目だろうという指摘も。気をつけます。)

27
26
2

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
27
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?