はじめに
Java開発者がRubyを学ぶ理由は何でしょうか。Rubyはその多様性と柔軟性でJavaを見事に補完してくれるので、両方の言語を使うことで、より効率的で効果的な開発ができるためです。実際、私は開発にはすべてJava、Ruby、Common Lispを使っていますが、その中でもRubyが開発の中心になりつつあります。特に、Java開発者がRubyを好む理由は次のようなものです。
- Rubyはスクリプト言語なので、小規模なプロジェクトに向いている。データ変換やテキスト処理用のユーティリティをすばやく作成する必要がある場合、私は必ずと言っていいほどRubyを使用している。
- Rubyは動的かつシンプルな言語である。
- Rubyを使うと、違った視点から問題が解決することがよくある。
- JRubyはまだ開発段階だが、Java VMベースのすぐれたRuby開発プラットフォームとなると思われる。現在、IntelliJ、NetBeans、EclipseのいずれもRubyを強力にサポートしている。
- 通常、ソフトウェアのメンテナンスはコードの行数に比例してコストが増加するが、Rubyは短く簡潔なプログラムなので、他のプログラムに比べて読みやすく、内容を理解するのもメンテナンスを行うのも簡単である。
- Ruby on RailsによるWeb開発フレームはバックエンドにデータベースを配置した、中小規模のWebアプリケーションに最適であるが、Ruby on Railsを利用するにはRubyの知識が必要である。
この記事では、RubyがJava開発者と非常に相性が良い理由を示すために、開発をより効率的にする言語的な特長を紹介し(表1「RubyとJavaの特長の比較」を参照)、両方の言語の短いサンプルプログラムを紹介します。
言語機能 | Ruby | Java |
文字列操作 | 可 | 可 |
全クラスの継承 | 可 | final宣言をされたクラスを除く |
ダックタイピング | 可 | 不可 |
ブロックコード | 可 | 不可 |
正規表現 | ネイティブサポート | 標準ライブラリによるサポート |
外部プログラムの使用 | 可 | 可。ただしRubyほど簡単ではない。 |
ネットワークプログラム | 標準ライブラリにおるサポート | 標準ライブラリによるサポート |
型付け | 動的 | 静的 |
継承 | mix-insによる多重継承をサポート | シングル |
必要なもの
この記事を読み進めるには、外部のRubyライブラリをインストールする必要があります。RubyGemsライブラリシステムをインストールすると、この作業を簡単に行うことができます。RubyGemsをRubyForgeからダウンロードして、ご使用のオペレーティングシステムのインストール手順に従ってインストールしてください。既にRubyがセットアップされている場合、RubyGemsが含まれているかを確認してください(多くのRubyインストールパッケージにはRubyGemsが含まれています)。インストールされているかを確認するには、コマンドシェルでgemと入力します。ライブラリを一括管理できる保管場所とRubyGemsなどの標準ツールがあれば、必要なライブラリを探し、それをインストールして複数のプロジェクトで使うといった作業が必要なくなり、多くの時間を節約できます。
以下のコマンドを使って必要なgemsをインストールします。
gem query --remote # if you want to see all available remotely # installable gems sudo gem install activerecord sudo gem install mysql # if you want to use MySQL sudo gem install postgres-pr # optional: install "pure ruby" # PostgreSQL interface sudo gem install postgres # optional: install native PostgreSQL # interface sudo gem install ferret # a search library like Lucene (same API) sudo gem install stemmer # a word stemming library for demonstrating # extending a class gem query # to show gems locally installed gem specification activerecord # info on gem # (ActiveRecord in this example)
Mac OS XやLinuxでは、sudoを使ってgem installを実行する必要がありますが、Windowsユーザーの場合は最初に「sudo」と入力する必要はありません。
また、この記事では、次のようにRuby irbシェルを使用します。この記事を読み終えるまでは、Ruby irbシェルを開いたままにしておいてください。
markw$ irb >> s = "a b c" => "a b c" >>
サンプルプログラムとコード例は、コピーしてirbインタラクティブセッションに貼り付けることができる程度に短くしています。
Rubyの文字列操作
RubyのString
クラスには、Javaの文字列操作機能よりも柔軟な数多くの文字列操作用メソッドが用意されています。この節では、Rubyの便利な文字列操作の一部を紹介します。以下のコード例は、文字列の連結、スライスを使った文字列の分割、サブストリングの検索の各操作を示しています(「#」の右側の文字は行末までプログラムコメントになります)。
# use the "pretty print" library. Defines the function 'pp' require 'pp' # define some strings to use in our examples: s1 = "The dog chased the cat down the street" s2 = "quickly" puts s1 # a substring slice up to and including character at index==6 puts s1[0..6] # a substring slice up to (but not including) the character at index==6 puts s1[0...6] # expressions inside #{} are inserted into a double quote string puts "He is a #{s2} dog #{1 + 6} days a week." # create a copy of the string: the new copy has white space removed puts " test ".strip # string literals can also be formed with single quotes puts s1 + ' ' + s2 puts s2 * 4 # find index (zero based) of a substring puts s1.index("chased") # replace a substring (/dog/ -> /giant lizard/) s1[4..6] = 'giant lizard' puts s1 # the << operator, which also works for arrays and other collections, # copies to then end s2 = s2 << " now" puts s2 puts "All String class methods:" pp s1.methods # the method "methods" returns all methods for any object
出力結果は次のようになります。
The dog chased the cat down the street The dog The do He is a quickly dog 7 days a week. test The dog chased the cat down the street quickly quicklyquicklyquicklyquickly 8 The giant lizard chased the cat down the street quickly now All String class methods: ["send", "%", "index", "collect", "[]=", "inspect", ....] # most methods not shown for brevity--try this in irb
上の例の<<演算子は、実はメソッド呼び出しです。式の評価時、Rubyでは中置演算子はメソッド呼び出しに変換されます。例えば、次のコードの<<演算子は、右側の式の値を左側の式の値に追加します。
>> "123" << "456" => "123456" >> "123".<<("456") => "123456" >> 1 + 2 => 3 >> 1.+(2) => 3
上の例の「.<<」という書き方は、メソッド呼び出しの標準書式です。
多くのクラスでは、<<演算子を使ってオブジェクトをクラス固有のコレクションに追加します。例えば、後述のFerret検索ライブラリ(先ほどインストールしたRuby gem)を見ると、インデックスにドキュメントを追加するために<<演算子がどのように定義されているのかが確認できます。