获取从java传递给jruby的变量

时间:2014-01-29 02:58:01

标签: java ruby jruby

这可能很简单,我会搜索这个,但没有运气

我有代码:

import org.jruby.embed.ScriptingContainer;
public class Test {
    public static void main(String[] args){
        ScriptingContainer container = new ScriptingContainer();
        int a = 1234;
        container.put("a", a);
        container.runScriptlet("a = a+10 ; puts a");
        System.out.println(a);

    }
}

您可以看到container.runScriptlet("a = a+10 ; puts a");的输出为1244System.out.println(a);1234 现在我想从jruby运行后必须更改a变量,以便 System.out.println(a);应为1244 怎么做?

1 个答案:

答案 0 :(得分:0)

你的例子永远不会像书面那样工作。 int是基本类型,将按值传递,而不是通过引用传递。也就是说,值1234传递给JRuby,而不是“a”。您可以通过在container.put中为变量指定其他名称来轻松查看。

如果您只需要一个变量,可以return it from your script

public class Main {
    public static void main(String[] args){
        ScriptingContainer container = new ScriptingContainer();
        container.put("a", 1234);
        Object v = container.runScriptlet("a += 10; a");
        System.out.println(v);
    }
}

如果您需要更多值,我建议您创建一个简单的bean,您可以使用它以有条理的方式传回值:

public class Main {
    public static class Values {
        private String name;
        private Long age;

        public void setName(String n) {
            this.name = n;
        }

        public void setAge(Long a) {
            this.age = a;
        }

        public String toString() {
            return name + " is " + age + " years old!";
        }
    }

    public static void main(String[] args){
        ScriptingContainer container = new ScriptingContainer();
        Values vs = new Values();
        container.put("values", vs);
        container.runScriptlet("values.age = 20; values.name = 'Tanya'");
        System.out.println(vs);
    }
}

作为第三种解决方案,请按照JRuby Javadocs

中的示例进行操作
ScriptingContainer container = new ScriptingContainer(LocalVariableBehavior.PERSISTENT);
container.runScriptlet("p=9.0");
container.runScriptlet("q = Math.sqrt p");
container.runScriptlet("puts \"square root of #{p} is #{q}\"");
System.out.println("Ruby used values: p = " + container.get("p") +
                   ", q = " + container.get("q"));