JRuby使用经验 - Ruby - language - ITeye论坛

作者: lexus
发布时间:2015-07-13 11:31:52

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的类

 

  1. require "your_jar_file_name.jar"  
  2. import your_packet_name  




java 方法:

 

  1. class JavaClazz {  
  2.     public void javaMethod(int i) {  
  3.         System.out.pintln(i);  
  4.     }  
  5. }  



在Ruby中如是调用:

 

  1. java_clazz = JavaClazz.new  
  2. java_clazz.javaMethod(1)  



将会抛出类型不匹配的异常,因为所有ruby中的数值,传递到java那里都是 Long 类型,解决办法如下:

 

  1. java_clazz = JavaClazz.new  
  2. java_clazz.javaMethod(java.lang.Integer.new(1))  

注:以上代码是运行在 JRuby 1.1.2 版本下,在最新版本 1.2.0中已经没有这个问题了, 多谢 RednaxelaFX 同学的指正.

=======================================华丽的分割线========================================

如果在java中使用了可变参数:

 

  1. class JavaClazz {  
  2.     public void javaMethod(int i,String... s) {  
  3.         ...   
  4.     }  
  5. }  



在ruby中应该这样调用:

 

  1. java_clazz = JavaClazz.new  
  2. java_clazz.javaMethod(java.lang.Integer.new(1),'this is a string')  
  3. // 只有一个参数,如果你知道java中的可变参数其实是一个数组的话  
  4.  java_clazz.javaMethod(java.lang.Integer.new(1),[].to_java(java.lang.String))  

 

=======================================华丽的分割线========================================


调用java中的常量,枚举enum

 

  1. class JavaClazz {  
  2.     public final String CONSTANT = "I can not change!"  
  3.     public enum Season { winter, spring, summer, fall }  
  4. }  

 

 

  1. puts JavaClazz::CONSTANT  
  2. puts JavaClazz::Season.winter  



=======================================华丽

标签: Ruby
来源:http://www.cnblogs.com/lexus/archive/2012/03/15/2397217.html

推荐: