Ruby会議2007のJRuby速報を見て

行けなかったけど想像してみる。
http://jp.rubyist.net/RubyKaigi2007/Log0609-S1-04.html

JRuby 1.0 リリース

やっぱりこの日に合わせたのか。
JavaOneじゃなくてRuby会議に合わせたのかね。

以降、1.0で試した。

Javaクラスのimportについて

include Java
import javax.swing.JFrame

jrubyJava のクラスを import する手段がいくつかあるんだけどこれが一
番いいのか?最後の質問のように何回も呼ぶとパフォーマンスが落ちるのか?

require 'java'
include_class 'javax.swing.JFrame'

どっち使うのがいいんだろ。チュートリアルが古いのか?

ところで、Java っていう定数を評価した時点で色々なことが行われる。
Object クラスに、java, javax, org, com などのメソッドが追加される。

これらはそれぞれ 新たにモジュールを定義し返す。
そのモジュールのmethod_missing と const_missing がいい感じ。
method_missing においては同様のモジュールを返し、
const_missing においてはクラスがあればクラスを返す。楽しい。

% jirb
irb > Java
Java
irb > java
Java::Java
irb > java.util
Java::JavaUtil
irb > java.util.List
Java::JavaUtil::List
irb > java.util.Foo
NameError: cannot load Java class java.util.Foo
        from (irb):12:in `binding'
...

ちなみに、Java モジュールの method_missing とconst_missing
も同様のことが可能。これによって java, javax, org, com から
始まらないパッケージに入ってるクラスにもアクセス可能。

irb > Java::jp.ne.hatena
Java::JpNeHatena

そういえば、swing のための JRuby ライブラリとして JRBuilder というのがあるな。
使ったことないけど。サンプルを見た感じ ブロックをつかうことでかなり簡略化して書けるんだな。
http://www2.webng.com/bdortch/jrbuilder/

Javaメソッドの見た目の違いは

camel case がなんとなく アンダースコア区切りになる。

irb > javax.xml.xpath.XPathFactory.instance_methods.sort
=> ["==", "===", "=~", "__id__", "__jcreate!", "__jsend!", "__send__", "class",
"clone", "com", "display", "dup", "eql?", "equal?", "equals", "extend", "freeze"
, "frozen?", "getClass", "getFeature", "get_class", "get_feature", "hash", "hash
Code", "hash_code", "id", "include_class", "inspect", "instance_eval", "instance
_exec", "instance_of?", "instance_variable_get", "instance_variable_set", "insta
nce_variables", "isObjectModelSupported", "is_a?", "is_object_model_supported",
"java", "java_class", "java_kind_of?", "java_object", "java_object=", "javax", "
kind_of?", "method", "methods", "newXPath", "new_xpath", "nil?", "notify", "noti
fyAll", "notify_all", "object_id", "org", "private_methods", "protected_methods"
, "public_methods", "respond_to?", "send", "setFeature", "setXPathFunctionResolv
er", "setXPathVariableResolver", "set_feature", "set_xpath_function_resolver", "
set_xpath_variable_resolver", "singleton_methods", "synchronized", "taint", "tai
nted?", "toString", "to_a", "to_java_object", "to_s", "to_string", "type", "unta
int", "wait", "xPathFunctionResolver=", "xPathVariableResolver=", "xpath_functio
n_resolver=", "xpath_variable_resolver="]
XPathFactory#getFeature(String) => XPathFactory#get_feature
XPathFactory#setFeature(String, boolean) => XPathFactory#set_feature
XPathFactory#isObjectModelSupported => XPathFactory#is_object_model_supported

getter/setter ぽいものは、アクセッサが定義される。
流石に述語メソッドを「?」付きにしてはくれない。

Action Listnerはひとつしかメソッドしかなかった。ブロックにしたら?

こういうことかな。

frame = java.awt.Frame.new
frame.add_mouse_wheel_listener(MouseWheelListener.impl {|_, e| puts e})

リスナのメソッドが二つ以上場合は、FooListener は たいてい 空実装の FooAdapter が
用意されてるんでそっちを継承して使うのがいいのかな
(JRubyでオーバーライドしたメソッドがJava上で有効になるようにになったのは最近のことですが)。
それともProxyクラスとcase式で書くのがいいのかな。

Continuation (継続)

実は、JRuby1.0 は Continuation 未実装です。

最後に

去年以上に濃そうだったな。見たかったな。。。