2010-07-02 22 views
3

我對使用class_eval的Ruby可變範圍的最佳實踐有個疑問。class_eval的類級變量的替代方法?

在此代碼中,在class_eval塊中,局部變量的第一個和第二個未定義。

def parent_method(opts={}) 
first = opts[:percent] 
second = (10 * first).to_i 

SecondClass.class_eval do 
    def second_method; return {:a => first, :b => second}; end; 
end 
end 

這似乎是一個範圍的問題,因爲我發現得到這個工作的唯一方法是使第一和第二類級別的變量:

def parent_method(opts={}) 
@@first = opts[:percent] 
@@second = (10 * @@first).to_i 

SecondClass.class_eval do 
    def second_method; return {:a => @@first, :b => @@second}; end; 
end 
end 
  1. 是什麼這種情況下的最佳做法?我認識到全局變量對於這個場景來說是一個糟糕的選擇,因爲結果的範圍很廣,但是類變量變量同樣不受歡迎?
  2. 除了處理變量作用域外,還有其他方法來處理class_eval中這些變量的可訪問性嗎?

回答

5

問題不在於class_eval,而是因爲def。當你這樣定義一個方法時,它會引入一個新的範圍。這裏是修復它的最好方法:

def parent_method(opts={}) 
    first = opts[:percent] 
    second = (10 * first).to_i 

    SecondClass.class_eval do 
     define_method(:second_method) { return {:a => first, :b => second} } 
    end  
end 
+0

太棒了!謝謝 - 這個作品! – shedd 2010-07-02 21:10:39