JRubyを久しぶりに
ツールを作る。いつもの通りJythonを使おうと思ったが、時間もあるのでJRubyにした。
以前は、JavaのAPIを繰り返し呼び出すだけの簡単なプログラムだったが、今回は少しだけJRubyでロジックも書いてみた。穴にはまった。
定数クラスから定数を取得するときは::を使う
java.awt.Colorから色を取得しようと思った。
1 2 3 4 5 6 7 8 9 10 11 | import java.awt.Color import java.awt.image.BufferedImage bi = BufferedImage.new(100, 100, BufferedImage::TYPE_INT_RGB) g = bi.createGraphics() g.color = Color.BLUE # → エラー g.color = Color::BLUE # → OK |
Rubyでは、メソッドの呼び出しのみを.(ピリオド)で行い、その他の呼び出しは::(コロン2つ)を利用するようだ。
メソッドの呼び出しは.でも::でもどちらでも良いらしい。
java.awt.Colorの.はピリオドでも良いようだ。しかし、java.awt.Color::BLUEは::だ。なんだこれ。
Javaクラスのimportはimport
Rubyの外部ファイル読み込みはrequire。
だからといって、Javaのクラスがすべて外部ファイルで定義されているわけではないので、requireではいけない。javaと同じようにimportを利用する。
1 2 3 4 5 6 7 8 | require "java" # → これはJRubyを組むときは読んでおいた方が良いらしい。 require "java.awt.Color" # → エラー import "java.awt.Color" # → OK |
単純なセッター、ゲッターはプロパティの様に呼び出しても良い
これは、なかなか面白い。
また、キャメルケースなメソッドをスネークケースに変換しても呼び出せる。
メソッドの括弧も省略できる。
1 2 3 4 5 6 7 8 9 10 11 | g.setColor(Color::RED) # → Java的。しかしエラーではない。 g.set_color(Color::GREEN) # → まだJava的。しかしエラーではない。 g.set_color Color::BLUE # → もう少し。しかしエラーではない。 g.color = Color::YELLOW # → OK |
ゲッター、セッターをプロパティとして扱えるのはKotlinっぽい。
ブロックコメント
ブロックコメントは
1 | =begin |
から
1 | =end |
に適用される。
よく、ソースの先頭に覚書を残すので、ブロックコメントの使い方は覚えておかなくては。
しかし、ネットをみると、ブロックコメントはあまり使わないらしい。
行コメントの#を使うようだ。今はIDEが良くできているので、各行に#を補ってくれるのだろう。
また、Javaでも言われているが、ブロックコメントの中にブロックコメントは書けないので、そういう時のためにブロックコメントは残しておくのだろうか。
しかし、Pythonと同様に複数行コメントに三重引用符が使える。
これでコメントを残しても良いのかな?
スクリプト引数
ARGVに引数が入っている。ARGVは配列。sizeやlengthで引数の数を確認できる。
1 2 3 4 5 | puts ARGV.size puts ARGV.length if ARGV.size > 0 puts ARGV[0] end |
また、$0にスクリプト(コマンド)そのものが入っている。
1 2 | puts $0 # → JRubyのirbで実行したらjirbが返ってきた。 |
まとめ
JRubyも良い言語だ。簡便に書けるし、実行速度も不足ない。
JythonとJRuby、どちらを選ぶかはなかなか悩む。