私は 2 つのクラス A と B を持っています。どちらにもいくつかのオプションがあります。通常、1 つのハッシュを使用して次のようなオプションを格納します@options[:name]='xxxx'
。今、メタプログラミングを使用してリファクタリングしたいのですが、
class A
set_option :name, "james"
set_option :address, "some street"
def hello
puts @options[:name]
puts @options[:address]
end
end
class B
set_option :age, 18
def greeting
put @options[:age]
end
end
set_option
ここで、キーと値のペアを 1 つのハッシュ インスタンスに設定するために使用したいのですが@options
、どうすればよいですか?
さらに、ソリューションを別のモジュールにラップしたいと考えています。
更新しました:
最初に感謝します。すべての回答は私にとって価値があり、より明確になります。今、私が望んでいることがあまり正しくないことに気づきました。このような質問をするとどうなりますか?
option
を置き換えるために1つの方法を使用するのは@options
どうですか?- クラスAとBの両方が1つの同じキーに異なるオプションを設定できるため、一部の回答
@@options
が機能しない可能性がありますか? 異なるクラスが異なるハッシュインスタンスを持つことができるようにしたい。
このように:
class A
set_option :name, "james"
set_option :provider, 'twitter'
def hello
puts option[:name]
end
end
class B
set_option :name, "not james"
def greeting
put option[:name]
end
end
よく考えた後、私が本当に欲しいのは、クラスのインスタンスではなく、異なるクラスの異なるオプションハッシュインスタンスだと思います。
これが私が望むものであり、それは機能します。
module HasOptions
def self.included(cls)
cls.class_eval do
def self.set_option(key, value)
options[key] = value
end
def self.options
@options ||= {}
end
def options
self.class.options
end
end
end
end
class Baz
include HasOptions
set_option :name, "bad"
def greeting
puts options[:name]
end
end
class Foo
include HasOptions
set_option :name, "foo"
def greeting
puts options[:name]
end
end
ご助力いただきありがとうございます。