「愛されたい!」と思ったときにJavaで書くRubyクラス
大場光一郎Akasaka.rb, Meadowy.org
今日の目的
•JavaでRubyクラスを書く
JRubyとは
•JavaVMで動くRuby実装•JIT、事前バイトコンパイル•Java Integration•Java 5.0 higher
JRubyを拡張したい
•動かしたいパッケージがC•openssl,RMagick4J,image_voodoo
•速くしたい
Mにおすすめ
•素直にRubyで書けば5行くらいですむところを50行で書く
生もの注意
•公開APIではなくて言語のコアに近い部分
•ゴリゴリ変わってます
JRubyを拡張する方法
•Rubyで書く•Dubyで書く•Javaで書く
Rubyで書く
•普通にRubyで書く•Javaクラスも呼べるよ
Dubyで書く
•型修飾ができるRubyっぽい言語
•コンパイラ型•Hashリテラルっぽい書き方
Dubyの例def foo(str) {str => :string} puts strend
Javaで書く
•速い•面倒•jarパッケージ
Javaで書こうRubyクラス
•Java SE 5.0•JRubyのソースコード一式
JavaクラスとRubyクラス
•クラス/メソッドの可視性•オーバーロード•オープンクラス
Javaで書くとき必要なこと
•メモリアロケーション•アノテーション
メモリアロケーション
•JRubyのrubyランタイムにクラスやモジュールを登録する
コード例 private static final ObjectAllocator ICONV_ALLOCATOR = new ObjectAllocator() { public IRubyObject allocate(Ruby runtime, RubyClass klass) { return new RubyIconv(runtime, klass); } };
RubyClass iconvClass = runtime.defineClass("Iconv", runtime.getObject(), ICONV_ALLOCATOR);
アノテーション
•Java 5から導入•javadoc/Rdocっぽい•メソッドやクラスに宣言的にメタ情報を記述
JRubyアノテーション
•クラス•モジュール•メソッド
クラスアノテーション
@JRubyClass(name = “Iconv”)class IconvClass {}
メソッドアノテーション
•引数の数/可変長引数•インスタンスか、特異か•ブロックの有無
コード例
@JRubyMethod(name = "open", required = 2, frame = true, meta = true)public static IRubyObject open(ThreadContext context, IRubyObject recv, IRubyObject to, IRubyObject from, Block block) {}
メソッドアノテーションの種類
•name,required•optional,rest•alias, meta, module•visibility, etc...
アノテーションをRubyへ定義
•クラスにどんなアノテーションがついているかRubyランタイムに登録する
コード例iconvClass.defineAnnotatedMethods(RubyIconv.class);
ロードしよう
ロードのJRuby拡張
•.rb .so .dll以外に.classと.jarの読み込みがサポート
require ‘hogehoge’require ‘hogehoge.class’require ‘hogehoge.jar’
.classをロードする
.jarをロードする
•jarredScript•jarに固めたclassファイルをロードする仕組み
•gemに含めるのも可
JarredScript
•規約指向•クラス名とjarファイル名を合わせる
•LoadService
LoadService
•JRubyがjar内から拡張クラスを探すきっかけになる• org.jruby.runtime.load.BasicLoadService•パッケージは無し
LoadServiceの例
jarに固める
JRubyを拡張しよう
•メモリアロケーション•アノテーション•jarに固める
Top Related