JRubyを始める

Ruby(JRuby)を始める(始めた)

Javaのサードパーティー製APIをスクリプトから呼びたくて始めたJython。
python言語は容易に学習でき、あっさり使えるようになったが、
日本語が出現するたびに悩むことになる。
・Javaで取得した任意の文字コードの文字列を加工しようと思ったとき
・Javaで取得した任意の文字コードの文字列をcodecs.openで出力しようとしたとき
これは、Jythonでなくても、python2.7でも同様に苦労することになった。
str文字列と、unicode文字列の違いで実行時エラーになってしまう。
Jythonがpython3になってくれれば…
Jythonはメンテナンスが止まっていそうなので、他の言語に逃げることに。

Kotlinはコンパイルもできるが、スクリプトでも実行できるので、Kotlinに挑戦した。
Kotlinは優れている。いろいろなロジックを簡潔に書けるようになっている。
lambdaも便利だし、型推論も便利。SmartCastも理にかなっている。null safeなところも良い。
しかし、スクリプトとして少し使いたいだけの時は、ちょっと面倒。
Javaで作られたモジュールはreturn Mapだが、それは暗黙にMapと決まっているとき、キャストせずに使いたい。
null safeなKotlinだけど、Javaで作られたモジュールは、躊躇せずnullを返してくる。
Kotlinで完結させるなら良いかもしれないけど、やはりサードパティーのJavaAPIを使おうと思うと…

そこで、JRubyを使うことにした。
rubyの構文は独特な気がしたので、なかなか手を出せなかったが遂にこの時が来た。
perlが得意だったこともあるため、使ってみると懐かしさもあった。
学習の順番が良かったかもしれない。Kotlinでlambdaの良さを感じた後だったので、
rubyのlambdaが心地よい。

ここが良いruby

rubyを使っていて、ここが良いと思ったこと。

unless

ifを否定で使いたいとき、ifが「もし~ならば」に対して、unlessは「もし~でなければ」と使える。

1
2
3
4
5
a = 1
b = 2
unless a == b
    puts "not equal."
end

perlみたい。

文字列への変数展開

“#{var_name}”とすることで、文字列に変数を展開できる。

1
2
3
4
var_name = "test value"
puts "TEST1:[#{var_name}]"
puts "TEST2:[#{var_name.size}]"
puts "TEST3:[#{var_name.upcase}]"

Kotlinみたい(Kotlinは$だけど)。

n回繰り返しが簡単

10.timesで10回繰り返しが書ける。

1
2
3
10.times do |i|
    puts i
end

pythonも簡単だけど、rubyはもっと簡単。

1
2
for i in range(10)
    print(i)

pythonはブロックをインデントで表現できるので、結構短くコーディングできる。

メイン処理

スクリプトなので、スクリプトの先頭から処理が走ってしまうが、
直接実行したときのみ実行されるメソッドを定義する。

1
2
3
if __FILE__ == $0
    puts "Main"
end

pythonでも似たような感じ

1
2
if __name__ == '__main__':
    print("Main")

pythonはブロックの終端を書かなくて良いのが素敵。

まとめ

JRubyはなかなか心地よい。
構文はシンプルで、面倒が少ない。
do endは慣れる必要があるが、その程度だと思う。

しかし、サードパーティのJavaAPIを呼ぶこととなると、少し面倒なところもある。
APIがその先で読んでいるAPIのjarが読めないことがある。
JRubyはCLASSPATHを理解してくれて、そこからライブラリを探して勝手に動いてくるのだが、
たまに、明示的にrequire “xxxx.jar”しなてくはならない時がある。

JRubyを通じてrubyの使い方が理解できたので、それはそれで良かったのだが、
サードパーティJavaAPIを呼び出すのは、結果的にKotlin+Java8になりそう。

dll hellならぬjar hellに耐性があるのはKotlin+Java7(8以降)だと思う。

同じタグの記事
同じカテゴリの記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA