Ruby会議2007のJRuby速報を見て
行けなかったけど想像してみる。
http://jp.rubyist.net/RubyKaigi2007/Log0609-S1-04.html
Javaクラスのimportについて
include Java import javax.swing.JFrame
jruby は Java のクラスを 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 未実装です。
JRuby Tシャツいいなぁ
http://www.bloglines.com/blog/ThomasEEnebo?id=29
http://headius.blogspot.com/2007/05/jruby-t-shirt.html
最後に
去年以上に濃そうだったな。見たかったな。。。