1. ホーム
  2. ruby

[解決済み] Rubyでモジュールのインスタンス変数を初期化するには?

2023-07-09 22:04:46

質問

インスタンス変数を使用したいモジュールがあります。現在、このように初期化しています。

module MyModule
  def self.method_a(param)
    @var ||= 0
    # other logic goes here
  end
end

initメソッドを呼び出して初期化することもできますね。

def init
  @var = 0
end

というのがありますが、これだと常に呼び出すのを忘れないようにしないといけませんね。

もっと良い方法はないでしょうか?

どのように解決するのですか?

モジュール定義で初期化する。

module MyModule
  # self here is MyModule
  @species = "frog"
  @color = "red polka-dotted"
  @log = []

  def self.log(msg)
    # self here is still MyModule, so the instance variables are still available
    @log << msg
  end
  def self.show_log
    puts @log.map { |m| "A #@color #@species says #{m.inspect}" }
  end
end

MyModule.log "I like cheese."
MyModule.log "There's no mop!"
MyModule.show_log #=> A red polka-dotted frog says "I like cheese."
                  #   A red polka-dotted frog says "There's no mop!"

これは、モジュールが定義されたときにインスタンス変数を設定します。 インスタンス変数やメソッドの定義を追加するために、後でいつでもモジュールを再オープンできることを覚えておいてください。 を追加したり、既存のものを再定義したりすることができます。

# continued from above...
module MyModule
  @verb = "shouts"
  def self.show_log
    puts @log.map { |m| "A #@color #@species #@verb #{m.inspect}" }
  end
end
MyModule.log "What's going on?"
MyModule.show_log #=> A red polka-dotted frog shouts "I like cheese."
                  #   A red polka-dotted frog shouts "There's no mop!"
                  #   A red polka-dotted frog shouts "What's going on?"