はじめに
本稿は、JRubyに固有の特徴を説明し、JRubyをJavaのクラスを利用するための簡易な言語として使えるようにします。JRuby一般の解説については『JRubyチュートリアル』などを参照してください。本稿はJRuby 1.0.2について書かれましたが、JRuby 1.0.3にも適用できます。
対象読者
読者は、RubyとJavaの基礎知識があると仮定します。
文字エンコーディング
JRubyは、文字をUTF-8扱いするか、それとも1バイトずつの列として扱うか、二通りの指定が-Kオプションや$KCODEで可能です(少なくともJRuby内部で指定を受理する部分はそのように作られています)。しかし、今のところ、その指定はほとんど意味をもっていません。
正規表現やinspect
メソッドは、指定にかかわらず、文字列をつねに1バイトずつの列として扱います。gets
やputs
などでも文字列をバイト透過に扱いますから、バイナリ・データとして漢字やかななどの非ASCII文字を扱うことはできます。
さらに重要なこととして、指定にかかわらず、Javaとの相互作用では、Rubyの文字列はつねにUTF-8であると仮定されます。
include Java
java.lang.System.out.println("あ")
このコードは、UTF-8で書かれているときに限り、Javaに正しく「あ」というUnicode文字を渡します。Javaは、渡された「あ」をプラットフォームのデフォルト文字エンコーディング(例えばShift_JIS)で印字します。
現状ではJRubyのプログラムはUTF-8で記述するのが妥当です。
標準Javaライブラリへのアクセス
下記によって標準Javaライブラリへのアクセスが可能になります。旧バージョン以来の方法もありますが、今はこの簡潔な方法で十分です。
include Java
例えば、UTF-8で下記のスクリプトを作成し、
include Java frame = javax.swing.JFrame.new("窓の例") label = javax.swing.JLabel.new("こんにちは") frame.getContentPane.add(label) frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE) frame.pack frame.setVisible(true)
JRubyで実行すると、このようなウィンドウが表示されます:
ここでjavax.swing.JFrame
という表現が何かRuby言語の範囲外の魔法に見えるかもしれません。しかし、実際には完全に正当なRuby式です。上記をメソッド呼出しの丸括弧を省略しないで書くとこうなります。
include(Java) frame = javax().swing().JFrame().new("窓の例") label = javax().swing().JLabel().new("こんにちは") frame.getContentPane().add(label) frame.setDefaultCloseOperation(javax().swing().JFrame()::EXIT_ON_CLOSE) frame.pack() frame.setVisible(true)
つまり、定数Java
とEXIT_ON_CLOSE
、それからローカル変数frame
とlabel
を除き、このプログラムにある識別子は実はすべてメソッド名です。このように"魔法を解いた"かたちにすればすぐに分かることですが、長々しくjavax.swing.JFrame
などと繰り返し書くのが面倒ならば、
include Java swing = javax.swing JFrame = swing.JFrame frame = JFrame.new("窓の例") label = swing.JLabel.new("こんにちは") frame.getContentPane.add(label) frame.setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE) frame.pack frame.setVisible(true)
のようにJavaのパッケージ名やクラス名(のように見えるRubyのメソッド呼出しの戻り値)を変数や定数に代入して、それを使い回せば十分です。
include Java
をせずに二重コロン記法を使ってJava::javax.swing.JFrame
のようにアクセスすることもできます。後述するように、実はこの記法の方が汎用性があります。