C# 检索修改后的变量值
我有一个IronRuby脚本,它通过C# 检索修改后的变量值,c#,ironruby,dynamic-language-runtime,C#,Ironruby,Dynamic Language Runtime,我有一个IronRuby脚本,它通过ScriptScope修改变量集的值 我想在修改变量后检索它的值,但是我得到了旧值 这是我的代码: var-engine=Ruby.CreateEngine(); var scope=engine.Runtime.CreateScope(); 范围。设置变量(“y”,11); var source=engine.CreateScriptSourceFromString(“y=33;puts y;”,SourceCodeKind.Statements); 来源、
ScriptScope
修改变量集的值
我想在修改变量后检索它的值,但是我得到了旧值
这是我的代码:
var-engine=Ruby.CreateEngine();
var scope=engine.Runtime.CreateScope();
范围。设置变量(“y”,11);
var source=engine.CreateScriptSourceFromString(“y=33;puts y;”,SourceCodeKind.Statements);
来源、执行(范围);
上述代码执行并将33
输出到控制台,这是正常的
但是,我尝试在上述代码之后添加以下行:
Console.WriteLine(scope.GetVariable(“y”);
并输出原始值11
有没有办法获得新的变量值?设置变量是为了改变输入 e、 g 如果你有y=y+1 在DLR之前,您应该先编写脚本“y=11”,然后再编写“y=y+1” 如果你想在y=15的情况下再次运行它,你会创建一个新的脚本,将y初始化为15,然后它会被再次解释
现在的情况是y=33被y=11替换,setvariable是这样的,您可以对不同的输入使用相同的编译脚本,使用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;
“y=33被y=11所取代”——这似乎没有发生,因为当我运行脚本时,ruby引擎输出
33
。另外,y=11
位于y=33
之前。我在将脚本更改为put y之后发现了这一点;y=33;把你放在一边代码>。这将输出11
和之后的33
,正如预期的那样。如果y仍然返回为11,即使它“应该”是33,这表明发生了其他事情,尽管我不太确定。我们使用IronPython,但原理类似,我会仔细研究一下,看看我是否能发现一些东西。我已经测试了你的解决方案,它是有效的。这一定是因为引用类型和值类型之间的差异,尽管我希望基元类型也能在这种情况下工作。你提出的解决方法在我的情况下是可以接受的,所以我会接受它作为答案。谢谢和+1!事实上,这是因为对象是传入引用的。但我不知道我们是否能在ref中传递一个数据类型基!