我在Ruby(1.9.3)中編寫了一小段代碼,並使用了一對簡單的「枚舉類」類,它們定義了一些常量,其中常量集合爲const_set而這些常量的某些行爲(例如類天可能有常數MON,TUE ...和天:: MON.succ應該評估爲TUE)。使用Class.new創建的類中的常量
我非常喜歡這些課程。然而,當越來越多我的代碼,我有時需要添加更多的人,我不喜歡有五個以上的類共享源代碼的99%,如的想法:
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的元編程功能可以用來生成這些類。但是,我有一個困難時期創造名字,INSTANCES和 「枚舉爲」 常數(例如MON,TUE,...)。 作爲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韓元「T中的類的名字是神奇集的上下文中調用(即天和月),但顯然在類的上下文中因此,不僅實例方法無法訪問它,而且每次調用enum_new都會使用新的名稱數組作爲參數調用它。使用類變量時會出現類似的問題,因爲它們將在用該方法生成的任何類之間共享(因爲它們將變成類的類變量,我猜)。
有什麼方法來創建與Class.new生成的類的常量,獲得這樣的類相同的一切,原來天和月類,而不必污染我的代碼幾乎相同的班?
感謝您的關注和耐心! :)
能否請你在你與你的省略號發出的代碼填? – Linuxios
我完成了第一個類的代碼,並添加了兩個示例操作來顯示我需要如何訪問實例方法中的常量。當然,通過用const_set創建的常量來訪問實例。 –