【问题标题】:Retrieve modified variable value检索修改后的变量值
【发布时间】:2012-06-03 19:03:54
【问题描述】:

我有一个 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输出到控制台,就OK了。

但是,我尝试在上述代码之后添加以下行:

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

它输出11,这是原始值。

有没有办法获取新的变量值?

【问题讨论】:

    标签: c# ironruby dynamic-language-runtime


    【解决方案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;
    

    【讨论】:

    • 我已经测试了您的解决方案并且它有效。这一定是因为引用类型和值类型之间的差异,尽管我希望原始类型也可以在这种情况下工作。您提出的解决方法在我的情况下是可以接受的,所以我会接受它作为答案。谢谢+1!
    • 确实是因为对象是传入引用。但我不知道我们是否可以在 ref 中传递数据类型基数!
    【解决方案2】:

    setvariable 是改变输入

    例如

    如果你有 y = y + 1

    在 DLR 之前,您应该将脚本设为“y = 11”,然后是“y = y + 1” 如果您想在 y = 15 时再次运行它,您将构建一个将 y 初始化为 15 的新脚本,然后它会再次被解释。

    发生的事情是 y = 33 被 y = 11 取代,setvariable 是这样您可以对不同的输入使用相同的编译脚本

    【讨论】:

    • "y = 33 被 y = 11" 取代 - 这似乎没有发生,因为当我运行脚本时 ruby​​ 引擎输出 33。此外,y = 11 位于 y = 33 之前。我在将脚本更改为puts y; y=33; puts y; 后发现了这一点。这会按预期输出11,然后是33
    • 如果 y 仍然以 11 的形式返回,即使它“应该”是 33,这表明正在发生其他事情,尽管我不确定。我们用的是 IronPython,但是原理差不多,我去翻找一下,没进去过,看看能不能发现什么。
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多