Ruby(1.9.3)に少しのコードを書いていますが、いくつかの定数を定義する単純な列挙型クラスのペアを使用します。const_setそしてこれらの定数の一部の動作(例えばクラス日はに火評価すべき定数月、火 ...と日:: MON.succを有していてもよいです)。Class.newで作成されたクラスの定数
私はこれらのクラスで本当に快適です。私のコードを成長させながら、しかし、例えば、私は時々それらの多くを追加する必要がある、と私は、ソースコードの99%を共有する5つの以上のクラスを持つことのアイデアを好きではない:
class Days
NAMES = %w(MON TUE ...)
INSTANCES = []
def initialize(num)
@num = num
end
# An example operation
def +(n)
INSTANCES[(@num + n) % INSTANCES.length]
end
# Another example operation
def succ
self + 1
end
def to_s
NAMES[@num]
end
NAMES.each_with_index do |name, idx|
instance = new(idx)
INSTANCES[idx] = instance
const_set name, instance
end
end
class Months
NAMES = %w(JAN FEB ...)
...
end
私が思っていましたこれらのクラスを生成するためにRubyのメタプログラミング機能を使用できるかどうか。しかし、私はNAMES、INSTANCESと "列挙ネーム" 定数(例えば月、火、...)の作成に苦労しています。 クラス、このコードでは、コンテキスト(自己の値)だのクラスメソッドconst_setであることは、それぞれ日とヶです。
ファクトリメソッドを作成するときに、私はこのような何かを余儀なくよ:
def enum_new(names_array)
Class.new do
const_set "NAMES" []
names_array.each_with_index do |name, idx|
NAMES[idx] = name
end
...
end
end
Days = enum_new(%w| MON TUE ... |)
Months = enum_new(%w| JAN FEB ... |)
が、これは動作しません(少なくとも、私はそれが望んで好きではない)、なぜならconst_setウォン「トン名前魔法セット(すなわち日とヶ)あるクラスのコンテキストで呼び出されるが、どうやらクラスの文脈で。したがって、インスタンスメソッドからはアクセスできないだけでなく、新しい名前の配列を引数として呼び出すたびに、それが上書きされます。enum_newが呼び出されます。同様の問題は、クラス変数を使用するときに表示されます。その理由は、メソッドで生成されたクラス間で共有されるからです(クラス変数クラスとなるためです)。
元日とヶ月間ほぼ同じで自分のコードを汚染することなくクラスにすべてのクラスと同じこの方法を取得し、Class.newで生成されたクラスの定数を作成するにはどのような方法がありますクラス?
あなたの注意と忍耐ありがとう! :)
あなたはあなたの省略記号を放出するコードを記入してくださいことはできますか? – Linuxios
私はファーストクラスのコードを完成させ、インスタンスメソッドの定数にどのようにアクセスする必要があるかを示す2つのサンプル操作を追加しました。もちろん、インスタンスはconst_setで作成された定数を介してアクセスされます。 –