2012-06-03 73 views
2

我有一個IronRuby腳本,通過ScriptScope修改變量集的值。檢索修改的變量值

我想檢索它被修改後的變量的值,但我得到舊值。

這是我的代碼:

var engine = Ruby.CreateEngine(); 
var scope = engine.Runtime.CreateScope(); 

scope.SetVariable("y", 11); 

var source = engine.CreateScriptSourceFromString("y=33; puts y;", SourceCodeKind.Statements); 
source.Execute(scope); 

上面的代碼執行,並輸出33到控制檯,這是確定。

然而,我試圖上面的代碼後添加下列行:

Console.WriteLine(scope.GetVariable("y")); 

並輸出11,其是該原始值。

有沒有辦法獲得新的變量值?

回答

1

隨着IronPython的,相同的編譯腳本來檢索的值,我用這樣的代理對象。

public class ScriptProxy 
{ 
    private int _result; 

    public int Result 
    { 
     get { return this._result; } 
     set { this._result = value; } 
    } 
} 

我呼籲SetVariable傳遞ScriptObject實例:

ScriptEngine pyEngine = Python.CreateEngine(); 
ScriptScope pyScope = pyEngine.CreateScope(); 

ScriptProxy proxy = new ScriptProxy(); 
pyScope.SetVariable("proxy", proxy); 

在你的腳本,你可以設置結果:

proxy.Result=33; 
+0

我已經測試過您的解決方案,它的工作原理。這必須是因爲引用類型和值類型之間的區別,儘管我也希望原始類型在這種情況下也能正常工作。你提出的解決方法在我的情況下是可以接受的,所以我會接受它作爲答案。感謝和+1! – GolfWolf

+0

確實,這是因爲對象是傳遞參考。但我不知道我們是否可以在ref中傳遞數據類型基礎! – Hyralex

0

Setvariable用於改變輸入

例如,

,如果你有Y = Y + 1

你會做你的腳本「Y = 11」其次是「Y = Y + 1」 如果然後你想運行它再次爲DLR之前y = 15,你會建立一個新的腳本,將y初始化爲15,然後再解釋它。

發生了什麼事爲y = 33得到由y = 11取代,setvariable是這樣,你可以使用不同的輸入

+0

「Y = 33是越來越取代由y = 11「 - 這似乎沒有發生,因爲紅寶石引擎在運行腳本時輸出」33「。另外,'y = 11'在'y = 33'之前。在將腳本改爲'puts y; Y = 33;把你;'。如預期的那樣,這輸出「11」,然後輸出「33」。 – GolfWolf

+0

如果y仍然回到11,即使它「應該」是33,這表明還有其他事情正在發生,儘管我並不確定。我們使用IronPython,但原理是相似的,我會搜索一下,沒有在那裏,看看我是否可以發現一些東西。 –