JRubyっていいかも
昨日、新幹線の中で少しJRubyで遊んで楽しかったこと。
JavaのコレクションをRubyチックに使える。
今回はLinkedListなんぞを使ってみた。
とりあえずやってみる
jirbをとりあえず実行。
以下を実行。
LinkedListを選んだのは気分。
require 'java' => true import 'java.util.LinkedList' => ["java.util.LinkedList"] list = LinkedList.new => #<Java::JavaUtil::LinkedList:0x6355dc @java_object=[]> list.add 1 => true list.add 100 => true list.each{|num| puts num } 1 100 => nil puts list.class Java::JavaUtil::LinkedList => nil puts list.length 2 => nil list.clear => nil puts list.length 0 => nil list = nil => nil puts list.class NilClass => nil
なるほど。
これは楽しい。
for回したりしなくてもeachで取り出せる!
じゃあ、文字列と数値を混ぜて突っ込んだらどうなるんだろう?
やってみる。
require 'java' => false import 'java.util.LinkedList' => ["java.util.LinkedList"] list = LinkedList.new => #<Java::JavaUtil::LinkedList:0x4c47db @java_object=[]> list.add 1 => true list.add 'hoge' => true list.each{|contents| puts contents } 1 hoge => false list.each{|contents| puts contents.class } Fixnum String => false
おいおい。ちゃんと入れた時の型のまま入ってるよ・・・。
すげー。
調子に乗ってこうしたらエラー
moji = "" list.each{|contents| moji += contents } TypeError: can't convert Fixnum into String
まあ、当然。
で、こうしたらおkだった
moji = "" list.each{|contents| moji += contents.to_s } => false puts moji 1hoge => nil
おー。すげー。
javaなら型をしてしておかないと、for(Object hoge : list.toArray())みたいな感じにして、(int)hogeとかってキャストしないといけない。
混ざってたら面倒。
型を指定しちゃうと、他の型突っ込めないし。
Ruby++
list.methodsをすると
["peek_first", "offerFirst", "last", "contains", "pop", "indexOf", "get_last", "_wrap_yield", "poll", "poll_last", "getFirst", "index_of", "clone", "element", "peek_last", "addAll", "get", "removeLast", "listIterator", "+", "__jsend!", "lastIndexOf", "-", "size", "addLast", "addFirst", "remove_la
st_occurrence", "each", "removeLastOccurrence", "", "sort", "remove", "removeFirstOccurrence", "add_all", "set", "to_array", "add", "peekLast", "descendingIterator", "push", "poll_first", "clear", "last_index_of", "add_first", "length", "peek", "remove_last", "list_iterator", "get_first", "pollLas
t", "removeFirst", "remove_first_occurrence", "=", "offerLast", "remove_first", "toArray", "sort!", "descending_iterator", "join", "offer", "offer_last", "offer_first", "pollFirst", "add_last", "<<", "peekFirst", "getLast", "first", "iterator", "hashCode", "subList", "hash_code", "equals", "sub_li
st", "containsAll", "is_empty", "contains_all", "retain_all", "isEmpty", "to_string", "empty", "retainAll", "remove_all", "removeAll", "empty?", "toString", "min", "zip", "detect", "each_with_index", "max", "reject", "sort_by", "select", "inject", "group_by", "all?", "find_all", "partition", "grep",
"include?", "map", "entries", "member?", "to_a", "find", "any?", "collect", "getClass", "notify_all", "notify", "wait", "notifyAll", "get_class", "__jcreate!", "equal?", "java_object=", "java_class", "synchronized", "hash", "==", "to_java_object", "eql?", "java_object", "to_s", "java_kind_of?", "in
clude_class", "instance_variable_defined?", "untaint", "public_methods", "instance_eval", "singleton_methods", "__id__", "inspect", "kind_of?", "org", "instance_exec", "tainted?", "object_id", "respond_to?", "instance_variable_set", "method", "taint", "methods", "com", "send", "===", "instance_varia
ble_get", "__send__", "type", "private_methods", "=~", "frozen?", "javax", "instance_of?", "class", "display", "trap", "dup", "instance_variables", "__jtrap", "id", "extend", "protected_methods", "nil?", "freeze", "java", "is_a?"]
Rubyのメソッドで置き換えられてる感じ。
list.java_object
=> [1, hoge]
とりあえず、いろいろ試してみたくなった!