我想將某些大寫標識符視爲動態計算的常量 - 因此,當我評估代碼字符串(如eval(「foo(BAR)」)時,我可以查找BAR的值並將其提供給評估。如何在const_missing(),threadsafe中使用對象的實例變量?
甚至不問我爲什麼要這樣做。 :-)
問題在於,const_missing()(不像method_missing())必須是類方法,而不是實例方法。所以,如果我嘗試寫這樣的功能:
def self.const_missing(name)
if @data[name]
return @data[name]
end
raise "Missing const #{name.inspect}"
end
我不能看到實例變量@data,告訴我FOO的值應該是什麼。
我當然可以使用類變量@@數據,但這不會讓我爲每個對象提供不同的數據。在執行eval之前,我可以立即從@data設置@@ data,但這不會是線程安全的,也不是遞歸友好的。
我的回退是使用線程本地存儲來包含一堆@data,並在eval調用之前和之後推送和彈出@data。但那感覺很不雅...
有沒有更好的方法來做到這一點?
我可以很容易地使用self.instance_eval(「foo(BAR)」)。該字符串來自內部程序員使用的GUI生成的數據結構,用於添加要在特定條件下執行的代碼片段......代碼也必須以字符串形式提供......理論上,我可以將BAR壓縮到BAR在執行之前使用method_missing,但這會增加其他複雜性。 – ChrisPhoenix