1

モジュールを動的に要求してから、初期化メソッド内にモジュールを含めようとしています。

# file: object.rb

class Object

  attr_accessor :array

  def initialize array
    @array = array
    @array.each do |f|
      require_relative "#{f}"
      include f.capitalize # the method name is the same as the filename
      puts @variable # property from included method
    end
  end
end

object = Object.new ['a','b','c']

これらのモジュールファイルで

# file: a.rb

module A
  @variable = 'string A'
end

b と c についても同様

エラーが発生し続けます:

`block in initialize': undefined method `include'

私はここで何を間違っていますか?私がやろうとしていることを達成するためのより良い方法はありますか?

4

2 に答える 2

2

そのようにinclude呼び出すことができない理由は、それがクラスとモジュールでのみ定義されているメソッドであるためですが、暗黙的なレシーバーのようなインスタンス メソッド内では、クラス自体ではなく、クラスのオブジェクトです。initializeincludeinitialize

新しく作成されたオブジェクトでメソッドを使用できるようにするだけでよいため、extend代わりにinclude. モジュールまたはクラスにインスタンス メソッドとして追加するのではなく、指定されたモジュールのメソッドをシングルトン メソッドとしてオブジェクトに追加するという点で、extendオブジェクトごとのバージョンに似ています。include

于 2013-09-04T17:24:54.303 に答える
2
require_relative "#{f}"

引用符に注意してください。'#{f}'は補間されません。

于 2013-09-04T17:35:02.047 に答える