从Java中回到Jruby

  • 本文关键字:Jruby Java 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现在我希望a变量必须在从Jruby运行后进行更改,以便 System.out.println(a);应该是1244如何做?

您的示例永远无法按书面形式工作。int是一种原始类型,将按值,而不是通过参考传递。也就是说,价值1234被传递给jruby,而不是" a"。您可以通过在container.put中给变量一个不同的名称来轻松看到这一点。

如果您只想返回一个变量,则可以从脚本中返回:

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"));

相关内容

  • 没有找到相关文章

最新更新