まめ畑

ゆるゆると書いていきます

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]

とりあえず、いろいろ試してみたくなった!