2014-04-11 78 views
0

我想將某些大寫標識符視爲動態計算的常量 - 因此,當我評估代碼字符串(如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。但那感覺很不雅...

有沒有更好的方法來做到這一點?

回答

0

甚至不問我爲什麼要這樣做。 :-)

thx的建議,但爲什麼你到底在做什麼?

我在問,因爲如果你試圖解釋你試圖解決的問題,那麼人們可能會向你展示一種不同的方法。

另一件事,千萬別用eval。不要!如果您無法使用其他可能的元編程方法(如class_evalinstance_evalmethod_missing)和朋友之一,則可能是錯誤的。

讓我強調,不要使用eval()

+0

我可以很容易地使用self.instance_eval(「foo(BAR)」)。該字符串來自內部程序員使用的GUI生成的數據結構,用於添加要在特定條件下執行的代碼片段......代碼也必須以字符串形式提供......理論上,我可以將BAR壓縮到BAR在執行之前使用method_missing,但這會增加其他複雜性。 – ChrisPhoenix

相關問題