3

モジュール内でクラス メソッドを動的に定義するのに問題があります。以下のコードを参照してください。NameError: undefined local variable or methodモジュール内の別のクラス メソッドを参照しようとすると、エラーが発生します。これはスコープまたはコンテキストの問題のようですが、これまでのところ把握できていません。

module Bar

  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods

    def fruits
      ["apple", "orange", "banana"]
    end

    def example_function(string)
      string.upcase
    end

    fruits.each do |fruit|
      method_name = fruit.to_sym
      define_method(method_name) { example_function(fruit) }
    end

  end

end

class Foo
  include Bar
end

puts Foo.apple
puts Foo.orange
puts Foo.banana

私は呼び出すことができるようにしたい:

puts Foo.apple => "APPLE"
puts Foo.orange => "ORANGE"
puts Foo.banana => "BANANA"

現在、これらのいずれかを試すと、次のエラーが発生します。 NameError: undefined local variable or method 'fruits' for Bar::ClassMethods:Module

さらに、Bar::ClassMethods のクラス メソッドを Foo で使用できるようにする必要があるため、次のように呼び出すことができるはずです。

puts Foo.fruits => ["apple", "orange", "banana"]

要件:

  1. すべてのコードは単一のモジュール内にあります。
  2. このモジュールでは、インスタンス メソッドとクラス メソッドの両方を混在させることができます (以下の記事)。
  3. ターゲット メソッドは動的に定義されます。

「Include vs Extend in Ruby」を読んでください (特に「A Common Idiom」というタイトルのセクション) http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/

これに関するヘルプは大歓迎です!

4

1 に答える 1