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
そこで、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以降)だと思う。