83

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

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

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

def init
  @var = 0
end

しかし、これは私が常にそれを呼び出すことを覚えておく必要があることを意味します.

これを行うより良い方法はありますか?

4

5 に答える 5

112

モジュール定義でそれらを初期化します。

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?"
于 2009-03-30T19:42:45.903 に答える
5

以下を使用できます。

def init(var=0)
 @var = var
end

何も渡さない場合は、デフォルトで 0 になります。

毎回呼び出す必要がない場合は、次のようなものを使用できます。

module AppConfiguration
   mattr_accessor :google_api_key
   self.google_api_key = "123456789"
...

end
于 2009-03-30T18:03:15.470 に答える
2

どうやら Ruby でモジュール内のインスタンス変数を初期化するのは悪い形です。(理由は完全にはわかりませんが、インスタンス化される順序に関するものです。)

次のように、遅延初期化でアクセサーを使用することをお勧めします。

module MyModule
  def var
    @var ||= 0 
  end
end

次にvar、のゲッターとして使用し@varます。

于 2014-04-15T12:14:19.813 に答える
2

私は同様の質問に答えました。これを行うクラスインスタンス変数を設定できます

module MyModule
  class << self; attr_accessor :var; end
end

MyModule.var
=> nil

MyModule.var = 'this is saved at @var'
=> "this is saved at @var"

MyModule.var    
=> "this is saved at @var"
于 2012-01-09T05:13:24.093 に答える
1

クラスの場合、クラスの新しいインスタンスを .new するたびに初期化が呼び出されるため、次のように言います。

def initialize
   @var = 0
end

実用的な Rubyから:

包含クラスの初期化が super を呼び出す場合、モジュールの初期化が呼び出されると述べていますが、これは初期化の特別な処理ではなく、どこでもスーパーがどのように機能するかの結果であるとは言及していません。(なぜ、initialize が特別な処理を受けると仮定するのでしょうか? 可視性に関して特別な処理が行われるためです。特殊なケースでは混乱が生じます。)

于 2009-03-30T18:12:28.087 に答える