2011-12-08 73 views
1

我嘗試從運行時添加的方法更改實例屬性,並在流方法中繼續使用相同的方法。從實時添加的方法更改實例屬性

class Test 

     def start 
     @s = 5 
     puts "start #{@s}" 
     end 

     def test_1 
     @s = 4 
     puts "test_1 #{@s}" 
     end 

     def flow 
     start 
     test_2 
     puts "flow #{@s}" 
     end 
    end 

Test.class_eval("def test_2\n puts 'test_2 1 #{@s}'\n @s = 7\n test_1\n puts 'test_2 2 #{@s}'\n end\n") 
    t = Test.new 
    t.flow 

的,結果是: 開始5 test_2 1 TEST_1 4 test_2 2 流4

所以我coudl沒有弄清楚什麼是跳過test_2的打印的原因1打印以及爲什麼類屬性的值未從新評估的方法更新。

回答

2

因爲在您的示例行中用於括號爲class_eval的雙引號,因此Ruby準備替換@s變量(此階段此變量等於nil)。更改您的代碼,以便:與class_eval

Test.class_eval('def test_2; puts "test_2 1 #{@s}"; @s = 7; test_1; puts "test_2 2 #{@s}"; end') 
# => 
    start 5 
    test_2 1 5 
    test_1 4 
    test_2 2 4 
    flow 4 

或使用塊一起(這是好多了,我相信)

Test.class_eval do 
    def test_2 
    puts "test_2 1 #{@s}" 
    test_1 
    puts "test_2 2 #{@s}" 
    end 
end 

與一個或多個音符。您的@s = 7分配是多餘的,因爲在test_1方法中,您立即準備另一個分配@s = 4

+0

感謝您的回覆。這只是DSL的簡化示例,它基於從UI定義的方法並存儲在數據庫中。我的問題是,新方法的評估和獲得類屬性不退出該方法後更新這些歸因。假設我有一個定義爲類屬性的字符串數組。在一個評估方法中,我改變了Array中的一個字符串,並且在退出後,我沒有看到這個String在這個類的下一個方法中被改變了。假設這是一個錯字錯誤或者可能是我錯過了一些裏比原則 – user1087894

相關問題