: O. Yuanying

JRuby 0.9.1 now!

JRuby関連の話題をJavaにカテゴライズするかRubyにカテゴライズするか悩むところ。

というわけでJRuby 0.9.1がリリースされました。

主な変更点は、

  • Overall performance is 50-60% faster than JRuby 0.9.0
  • Improved Rails support
  • New syntax for including Java classes into Ruby
  • New interpreter design
  • Refactoring of method dispatch, code evaluation, and block dispatch code
  • Parser performance enhancement
  • Rewriting of Enumerable and StringScanner in Java
  • New experimental syntax for implementing interfaces
  • 86 Jira issues resolved since 0.9.0

とのことですが、いくつかブログを検索したところみんな口をそろえたように「Overall performance is 50-60% faster than JRuby 0.9.0」を強調しています。

いままでよっぽど遅かったんですな。まあ私は遅さを認識するほど使い込んでませんが。

ちなみに私が気になったのは次の二点。

  1. New syntax for including Java classes into Ruby
  2. New experimental syntax for implementing interfaces

New syntax for including Java classes into Ruby

いままではJavaのクラスをJRubyのコードから使うためには、JRubyに定義された「include_class」とか言うのを使ってましたが、0.9.1からはそんなめんどくさいことしなくても、すぐに利用できるようになってます。

# Import Java packages
require 'java'

# 0.9.0
include_class "javax.swing.JButton"
button = JButton.new('Klick Me!')

# 0.9.1
button = javax.swing.JButton.new('Klick Me!')

まあ素敵。

しかもRubyのクラスは単なる定数として扱われます。つまりこんなことも。

# Import Java packages
require 'java'

JFrame = javax.swing.JFrame
frame = JFrame.new("Hello Swing")

おもしろい。

New experimental syntax for implementing interfaces

次に、「実験的なインターフェスを実装する新しいシンタックス」だが、どうもJRubyのページを色々探してみたんだけど、どんなシンタックスなのかさっぱり出てこない。

ダウンロードしたjrubyのサンプルフォルダの中にjava.awt.event.ActionListenerを実装しているコードが見受けられるけどまさかこれじゃないよね?

button = javax.swing.JButton.new("Klick Me!")

class ClickAction < java.awt.event.ActionListener
  def actionPerformed(evt)
    javax.swing.JOptionPane.showMessageDialog(nil, "<html>Hello from <b><u>JRuby</u></b>.<br> Button '#{evt.getActionCommand()}' clicked.")
  end
end
button.addActionListener(ClickAction.new)

いくつかぐぐってみてもそれっぽいけど動かないコードをなんとかみつけたくらい。

やっぱ実験的なシンタックスというくらいだから、あまり公表したくないんだろうか?(だとしたらリリースノートで触れるなとか言いたいところだが...)