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は「もし~でなければ」と使える。
a = 1
b = 2
unless a == b
puts "not equal."
end
perlみたい。
文字列への変数展開
“#{var_name}”とすることで、文字列に変数を展開できる。
var_name = "test value"
puts "TEST1:[#{var_name}]"
puts "TEST2:[#{var_name.size}]"
puts "TEST3:[#{var_name.upcase}]"
Kotlinみたい(Kotlinは$だけど)。
n回繰り返しが簡単
10.timesで10回繰り返しが書ける。
10.times do |i|
puts i
end
pythonも簡単だけど、rubyはもっと簡単。
for i in range(10)
print(i)
pythonはブロックをインデントで表現できるので、結構短くコーディングできる。
メイン処理
スクリプトなので、スクリプトの先頭から処理が走ってしまうが、
直接実行したときのみ実行されるメソッドを定義する。
if __FILE__ == $0
puts "Main"
end
pythonでも似たような感じ
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以降)だと思う。
コメントを残す