Rubyで逆ポーランド変換機を作りgem作成&コマンドの使い方:若手エンジニア/初心者のためのRuby 2.1入門(13)(1/4 ページ)
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。連載最終回の今回は、小規模なgemの作成にチャレンジしてみましょう。gem作成の一連の流れを体験するために、逆ポーランド記法による計算機アプリケーションを作ってみましょう。
変幻自在なRubyの面白さを
今回の主な内容
- Rubyのパッケージ「gem」とは
- 逆ポーランド記法とは
- 逆ポーランド変換機を作ろう
- サンプルコードの入手
- bundle gemコマンドのジェネレーターでgemのひな型を作成
- 補足:bundlerが使えない場合
- gemspecファイルを埋める
- ひな型のコードを編集する
- bundle installコマンドで依存ライブラリをインストール
- bundle execコマンドで実行する
- クラスファイルにアルゴリズムを閉じ込める
- RpnCalculatorモジュールから呼び出す
- 計算機プログラムの動作確認
- RSpecで簡単なユニットテストを書いてみる
- gemのパッケージを生成する
- さらに使いやすく改良してみよう
- 連載の終わりに
連載第12回目に当たる前回の「難しいが強力! Rubyのメタプログラミング、self、特異クラス/メソッド、オープンクラスとモンキーパッチ」では、RubyをRubyたらしめる、メタプログラミングの基本的なトピックについて解説しました。
少し難しかったかもしれませんが、初心者からステップアップするためには避けては通れない道です。また、クラスメソッドの定義は現場でもしばしば使われるテクニックなので、ぜひ活用してみてください。
連載最終回の今回は、小規模なgemの作成にチャレンジしてみましょう。gem作成の一連の流れを体験するために、逆ポーランド記法による計算機アプリケーションを作ってみましょう。
Rubyのパッケージ「gem」とは
gemとはRubyで使えるライブラリや、Ruby製のソフトウェアをパッケージ化したものです。gemコマンドで簡単にライブラリをインストールしたり、依存関係のあるモジュールを制御したりすることができます(連載第2回で、pryをインストールするときにも使いましたね)。
作成したgemは「RubyGems.org」にアップロードして配布できます。Rubyでは定番のWebフレームワークである、Ruby on RailsもRubyGems.orgから導入できます。
通常はgemコマンドのソースがRubyGems.orgに設定されているので、「gem install pry」のようなインストールコマンドを実行すると、RubyGems.orgからgemパッケージを取得してインストールが行われます。
逆ポーランド記法とは
「逆ポーランド記法」とは、数式を表記するための記法の一つです。
中置記法
通常、私たちは数式を記述するとき、「中置記法」を使います。中置記法とは、演算子を真ん中に置き、被演算子を左右に配置するような書き方です。簡単な例を示しましょう。
12 + 30
簡単ですね。ここでは演算子である「+」(プラス)が、被演算子(12と30)の間にはさまれて、12と30という値の加算を表現しています。
逆ポーランド記法(後置記法)
逆ポーランド記法では、被演算子を先に書き、続けて演算子を書きます。演算子が被演算子の後にくるので、逆ポーランド記法は「後置記法」とも呼ばれます。上述の例の逆ポーランド記法版を示しましょう。
12 30 +
まず、被演算子(12と30)が先に来て、その後演算子である「+」(プラス)が出現しています。
もう少し複雑な例を見てみましょう。
5 2 3 + -
これは、中置記法で書けばこのような演算になります。
5 - (2 + 3)
逆ポーランド変換機を作ろう
逆ポーランド記法計算機は、プログラミングの練習問題としてよく取り上げられます。これは、中置記法で書かれた数式をパースして演算するよりも、「スタック」というデータ構造を用いることで簡単に実装できるからです。
スタックとは、いわゆる後入れ先出しのデータ構造で、基本的なデータ構造の一つです。スタックに対する基本的な操作として、データを入れるための「push」とデータを取り出すための「pop」があります。pushによって下から上に向かってデータを積み上げ、popによって一番上のデータを取り去るイメージです。
では、スタックを使って、「5 2 3 + -」という逆ポーランド記法で書かれた数式を解く手順を以下の図に示します。
- まず、スタックが空の状態から始まる
- 数式から取り出した要素をpush操作でスタックに積む。ここでは数字(5)なので、そのまま次に進む
- 次の要素も数字(2)なので、push操作でスタックに積んで次に進む
- その次の要素も数字(3)なので、push操作でスタックに積んで次に進む
- 次の要素(+)も同様に積む
- ここで、一番上の要素が演算子(+)なので、+の下に積まれている2個の要素をpopし、足し合わせたもの(黄緑色)をスタックに積む
- 次の要素(-)をスタックに積む
- 6と同様、-の下に積まれている2個の要素をpopし、引き算したもの(黄緑色)をスタックに積む。最終的に1個の要素が残り、これが演算結果となる
このように、逆ポーランド記法で記述された数式は、機械的な手順で解くことができます。
ここからは、コマンドライン引数に与えられた逆ポーランド記法による数式を解くアプリケーションを作成します。
サンプルコードの入手
紹介する計算機アプリケーションの完成形のソースコードは、以下の筆者のGitHubのページから入手できます。
もしGitをお使いであれば、以下のコマンドでリポジトリをクローンできます。もしGitをお使いでなくても、上記のページからzipアーカイブとして入手できます。
$ git clone git@github.com:mozamimy/rpn_calculator.git
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 数々の“スペル”で高度なプログラミング:Rubyの魔術
- 公用語に英語、「再起動」したRubyKaigi 2013が東京で開催
いったん終了していたRubyコミュニティ主催の年次イベントが再開。技術色、国際色を強め、盛況のうちに幕を閉じた - Web業界、今から行くならRubyエンジニアが狙い目?
不況で冷え込んでいたIT業界の転職市場に、回復の兆しが見え始めている。だが、業種や職種によって採用数や条件に大きな差異が生まれている。転職市場の動向を追い、自身のキャリア戦略立案に生かしてほしい。 - Ruby 2.0.0がリリース、大規模化対応の機能などを搭載
生誕20年となる節目を迎えて、プログラミング言語「Ruby」の最新版がリリースされた - 新バージョンで何が変わるのか、Rubyはどこへ向かうのか:まつもと×笹田、Ruby 1.9を語る
- いよいよ始まるRuby 1.9への移行:開発コアメンバが語るRubyの今とこれから(前編)
- Rubyの今後の進化の方向性とは?:開発コアメンバが語るRubyの今とこれから(後編)
- 互換性や脆弱性の問題にどう対応していくのか:Rubyが抱える課題、NaClの前田氏が講演
- Rails Hub情報局:「なんでRubyなんか作った!? 迷惑だ!」に対するMatzの答え
- Rails Hub情報局:Rubyはイノベーション言語として選ばれている
- Rails Hub情報局:Rubyのまつもと氏は、一発屋で終わるのか?
- Rails Hub情報局:Rubyに魔法は要らない
- 数々の“スペル”で高度なプログラミング:Rubyの魔術
- 晴読雨読@エンジニアライフ:『たのしい開発 スタートアップRuby』――なぜRubyistたちはあれほど楽しそうなのか
- 「JRuby 1.7.0」登場、1年半ぶりのメジャーアップデート
JavaVM上のRuby実装「JRuby」の最新版となる「JRuby 1.7.0」が、10月22日にリリースされた。