SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

JRubyからJavaへのアクセス方法

Javaのクラスを利用する簡易言語としてJRubyを使う方法


  • X ポスト
  • このエントリーをはてなブックマークに追加

Javaのクラスを利用するためにJRubyに用意されている固有の機能を説明します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 本稿は、JRubyに固有の特徴を説明し、JRubyをJavaのクラスを利用するための簡易な言語として使えるようにします。JRuby一般の解説については『JRubyチュートリアル』などを参照してください。本稿はJRuby 1.0.2について書かれましたが、JRuby 1.0.3にも適用できます。

対象読者

 読者は、RubyとJavaの基礎知識があると仮定します。

文字エンコーディング

 JRubyは、文字をUTF-8扱いするか、それとも1バイトずつの列として扱うか、二通りの指定が-Kオプションや$KCODEで可能です(少なくともJRuby内部で指定を受理する部分はそのように作られています)。しかし、今のところ、その指定はほとんど意味をもっていません。

 正規表現やinspectメソッドは、指定にかかわらず、文字列をつねに1バイトずつの列として扱います。getsputsなどでも文字列をバイト透過に扱いますから、バイナリ・データとして漢字やかななどの非ASCII文字を扱うことはできます。

 さらに重要なこととして、指定にかかわらず、Javaとの相互作用では、Rubyの文字列はつねにUTF-8であると仮定されます。

include Java
java.lang.System.out.println("あ")

 このコードは、UTF-8で書かれているときに限り、Javaに正しく「あ」というUnicode文字を渡します。Javaは、渡された「あ」をプラットフォームのデフォルト文字エンコーディング(例えばShift_JIS)で印字します。

 現状ではJRubyのプログラムはUTF-8で記述するのが妥当です。

標準Javaライブラリへのアクセス

 下記によって標準Javaライブラリへのアクセスが可能になります。旧バージョン以来の方法もありますが、今はこの簡潔な方法で十分です。

include Java

 例えば、UTF-8で下記のスクリプトを作成し、

include Java

frame = javax.swing.JFrame.new("窓の例")
label = javax.swing.JLabel.new("こんにちは")
frame.getContentPane.add(label)
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack
frame.setVisible(true)

 JRubyで実行すると、このようなウィンドウが表示されます:

 

 ここでjavax.swing.JFrameという表現が何かRuby言語の範囲外の魔法に見えるかもしれません。しかし、実際には完全に正当なRuby式です。上記をメソッド呼出しの丸括弧を省略しないで書くとこうなります。

include(Java)

frame = javax().swing().JFrame().new("窓の例")
label = javax().swing().JLabel().new("こんにちは")
frame.getContentPane().add(label)
frame.setDefaultCloseOperation(javax().swing().JFrame()::EXIT_ON_CLOSE)
frame.pack()
frame.setVisible(true)

 つまり、定数JavaEXIT_ON_CLOSE、それからローカル変数framelabelを除き、このプログラムにある識別子は実はすべてメソッド名です。このように"魔法を解いた"かたちにすればすぐに分かることですが、長々しくjavax.swing.JFrameなどと繰り返し書くのが面倒ならば、

include Java

swing = javax.swing
JFrame = swing.JFrame

frame = JFrame.new("窓の例")
label = swing.JLabel.new("こんにちは")
frame.getContentPane.add(label)
frame.setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE)
frame.pack
frame.setVisible(true)

 のようにJavaのパッケージ名やクラス名(のように見えるRubyのメソッド呼出しの戻り値)を変数や定数に代入して、それを使い回せば十分です。

別のアクセス方法
 普通のRubyモジュールと同じく、include Javaをせずに二重コロン記法を使ってJava::javax.swing.JFrameのようにアクセスすることもできます。後述するように、実はこの記法の方が汎用性があります。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Rubyらしさのための同義語

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

(鈴)(リン)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1953 2011/03/18 15:39

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング