JRuby使用经验 - Ruby - language - ITeye论坛
JRuby使用经验 - Ruby - language - ITeye论坛
首先我是一个Java程序员,很喜欢Ruby.
公司由于业务的需要,在Java项目中引入动态语言,目的是可以快速地修改业务逻辑以响应快速变化的业务需求.于是我有幸当了一回JRuby的先锋.当初使用JRuby的时候,我对JRuby项目的了解其实就是知道它可以让Ruby运行在JVM上面,其余细节一概不知,都是在实际使用中一点点地摸索,一点点地积累回来.在这一过程中,在 dennis_zane
同学身上,我学到了很多与Ruby相关或者不相关的东西,借机感谢一下.
JRuby的中文资料相当的稀少,在 Google上搜索,来来去去的就是介绍了下最基本的怎么从Java中调用Ruby代码,或者在Ruby中使用Java的类库.我从无数次遇到问题 => 解决问题的循环中也有那么一点点的使用心得,记录之,备忘.
* JRuby的入门资料,请访问 JRuby wiki 一般的使用方法这里都有介绍.
* 有两种方法可以使用JRuby,一是用BSF,二是使用JDK 6.BSF的方式已经过时了,JDK6中内置了对脚本语言的支持,默认的Javascript,要使用JRuby还要下载juby-engine.jar,当前最新版本是1.1.6 地址: https://scripting.dev.java.net/files/documents/4957/115972/jruby-engine-1.1.6.zip
=======================================华丽的分割线========================================
如果使用jar打包,在ruby代码中调用java的类
- require "your_jar_file_name.jar"
- import your_packet_name
java 方法:
- class JavaClazz {
- public void javaMethod(int i) {
- System.out.pintln(i);
- }
- }
在Ruby中如是调用:
- java_clazz = JavaClazz.new
- java_clazz.javaMethod(1)
将会抛出类型不匹配的异常,因为所有ruby中的数值,传递到java那里都是 Long 类型,解决办法如下:
- java_clazz = JavaClazz.new
- java_clazz.javaMethod(java.lang.Integer.new(1))
注:以上代码是运行在 JRuby 1.1.2 版本下,在最新版本 1.2.0中已经没有这个问题了, 多谢 RednaxelaFX 同学的指正.
=======================================华丽的分割线========================================
如果在java中使用了可变参数:
- class JavaClazz {
- public void javaMethod(int i,String... s) {
- ...
- }
- }
在ruby中应该这样调用:
- java_clazz = JavaClazz.new
- java_clazz.javaMethod(java.lang.Integer.new(1),'this is a string')
- // 只有一个参数,如果你知道java中的可变参数其实是一个数组的话
- java_clazz.javaMethod(java.lang.Integer.new(1),[].to_java(java.lang.String))
=======================================华丽的分割线========================================
调用java中的常量,枚举enum
- class JavaClazz {
- public final String CONSTANT = "I can not change!"
- public enum Season { winter, spring, summer, fall }
- }
- puts JavaClazz::CONSTANT
- puts JavaClazz::Season.winter
=======================================华丽