特集:初めてのIronRuby.NETでRuby開発を体験してみようデジタルアドバンテージ 一色 政彦2009/03/11 |
|
|
■IronRuby特有の機能
最初に、Ruby標準ライブラリについて押さえておこう。
●Ruby標準ライブラリを利用するには?
Ruby標準ライブラリとは、Ruby言語に標準で添付されている外部ライブラリである(このため、一般的には「添付ライブラリ」と呼ばれる)。なお、組み込み変数/関数/クラスなどの「組み込みライブラリ」と「標準ライブラリ」は異なるので注意してほしい。先ほどのputs関数は、Ruby言語自体に搭載されている「組み込み関数」である。
IronRubyでは、組み込みライブラリに加え、Ruby標準ライブラリが最初から使用できる状態になっている。例えば次のコードは、標準ライブラリのDateクラスのクラス・メソッド「today」を使って、今日の日付を出力している例だ(※「クラス・メソッド」とは、C#におけるstaticメソッド、VBにおけるSharedメソッド、つまり静的メソッドのことだ。これに対し、クラスをインスタンス化したオブジェクトのメソッドは「インスタンス・メソッド」と呼ばれる)。
|
|
Ruby標準ライブラリを利用したサンプル・プログラム |
上記のコードを見ると、1行目に「require」という組み込み関数が使われている。「require」は「要求する、もしくは、必要とする」という意味だが、要するにrequire関数はライブラリの利用を要求するためのものだ。ここでは「date」という名前のライブラリ*2を要求している。このdateライブラリには、DateクラスやDateTimeクラスが含まれている。
*2 厳密には、ライブラリ・パス(LibraryPaths。詳細は下記のコラムを参照)の配下にある.rbファイルのことで、その「.rb」拡張子を除いたファイル名がライブラリ名となっている(=require関数に指定するときは、拡張子を除いたファイル名で指定するのが一般的)。本稿のインストール例だと、LibraryPathsオプションに「C:\Program Files\Microsoft SDKs\ironruby\lib\ruby\1.8\」が含まれており、その配下に「date.rb」ファイルがある。もちろんこの.rbファイルは、絶対パスを使って次のように指定することもできる。
|
【コラム】IronRubyにおけるライブラリの利用設定 | |||
IronRubyでは、対話型コンソール/Rubyインタプリタであるir.exeの構成ファイル(ir.exe.configファイル)内に、Ruby標準ライブラリの設定がある。ir.exe.configファイルを開くと、例えば次のように、LibraryPathsオプションにRuby標準ライブラリへのディレクトリ・パスが設定されている。
このLibraryPathsオプションの値は、ライブラリの場所を示すディレクトリ・パスの配列であり、コード内からは「$:」もしくは「$LOAD_PATH」という組み込み変数で取得できる。例えば、インタラクティブ・モードで、どのようなライブラリ・パスからライブラリをロードできるかを調べるには、次のコードを実行すればよい。
|
●.NETライブラリを利用するには?
続いて、MRIではなくIronRubyを使う大きな理由の1つである「.NET Frameworkの基本クラス・ライブラリの利用」について紹介しよう。
この場合にはまず、利用したいクラスが含まれている.NETアセンブリへの参照が必要になるが、これには先ほども出てきた「require」関数を使う。(基本的には)実引数として「.NETアセンブリの厳密名」を指定する必要がある。
そして、クラス名を記述する際の、名前空間における階層の区切りは、Ruby言語では「::」を用いる(=C#やVBの「.」と同じ)。
例えば、「Hello World!」とコンソール出力するには、次のようなコードになる。
|
|
.NETライブラリを利用するサンプル・プログラム | |
ちなみに、「mscorlib」や「System.Drawing」など一部の基本的な.NETアセンブリは、次のようにアセンブリ名だけでも指定できる。require 'mscorlib' また、次のように.NETアセンブリを絶対パスで指定することも可能。 require 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll' |
この例では、mscorlibアセンブリとSystemアセンブリへの参照を要求し、「Hello World!」という実引数を指定して、System名前空間のConsoleクラスの静的メソッド(=Ruby言語におけるクラス・メソッド)であるWriteLineメソッドを呼び出している。
ちなみに.NETプログラミングだと、「using System;」(C#の場合)や「Imports System」(VBの場合)をファイルの冒頭に記述することで、「System.」という名前空間の修飾を省略するのが一般的だが、残念ながらRubyではこれが行えない。しかしこれに近い省略は可能で、それが「エイリアス」である。
例えば、先ほどの「System::Console」クラスのエイリアスを作成して、それを利用するには、次のようなコードになる。
|
|
クラスのエイリアスを作成するサンプル・コード |
●Windowsフォーム・アプリケーションを開発するには?
続いては、IronRubyでWindowsフォーム・アプリケーションを開発する方法を紹介しよう。ただし、(筆者が試した限り)現時点のir.exeの実装ではWindowsフォームの場合、日本語が文字化けしてしまうようなので注意してほしい(ちなみにir.exeの代わりに、後述の「Ruby In Steel for IronRuby」に含まれる「rbx.exe」を使うと文字化けしなかった)。
次のコードは、ボタンが1つだけ配置されたWindowsフォームのアプリケーションの実装例である。
|
|
Windowsフォーム・アプリケーションのサンプル・プログラム | |
newメソッドの ( ) は省略するのが一般的だが、C#/VB開発者にも分かりやすいように記述している。 |
C#やVBのプログラミングを知っていれば、何をしているか大体分かると思うが、System::Windows::Forms::Formクラスを継承してRubyFormクラスを作成し、最後の行でRubyFormクラスのnewメソッドでインスタンス化したRubyFormオブジェクトをSystem::Windows::Forms::ApplicationクラスのRunメソッドに引き渡している。これにより、Windowsフォームが実行される。
RubyFormクラスの内容を見ると、「def initialize」とあるが、def式はメソッドを定義するためのものだ。initializeメソッドはC#やVBでいうところの「コンストラクタ」で、クラスの初期化時に自動的に呼び出されるインスタンス・メソッドである*3。
*3 ちなみに、クラス・メソッド(=C#やVBの静的メソッド)を実装するには、「def RubyForm.class_method」のように、メソッドの前に「<クラス名>.」を付ければよい(もしくは、クラス自身を表す「self.」を付けてもよい)。 |
initializeメソッドの中では、まずWindowsフォームのTextプロパティの値を設定している(※「self」は自分自身、つまり、RubyFormオブジェクトへの参照を意味する。C#の「this」、VBの「Me」と同じ)。
そして、Buttonコントロールをインスタンス化(new)し、表示位置(Location)を指定して、ボタンのテキスト(Text)を設定している。
その後、「btn_Click」という「手続きオブジェクト」を作成し、これをClickイベント・ハンドラに設定している。手続きオブジェクトとは、厳密にはProcオブジェクトのことで、この例ではProc.newメソッドでインスタンス化されている。Proc.newメソッドの後ろに { 〜 } の記述があるが、これは「コード・ブロック」と呼ばれ、その中には、仮引数(この例では「sender」と「e」。「ブロック引数」と呼ばれる)と式(この例では「System::Windows::Forms::MessageBox.Show("Hello World!")」という1つの式)が定義されている*4。Clickイベント・ハンドラに「&」で修飾した手続きオブジェクトを指定しているが、これによりコード・ブロックの内容が渡されている。
*4 このProc.newのようなメソッドを「ブロック付きメソッド」と呼ぶ。なお、このコード・ブロックの例ではC#やVBに似せるために適宜改行しているが、もちろん改行せずに1行で書いてよい(※Ruby言語では、コード・ブロック内や ( ) 内であれば改行可能)。 |
最後に、「self.Controls.Add」メソッドの呼び出しで、ボタンをフォームのコントロールとして登録している。
以上のコードを実行すると、次のようになる。
Windowsフォーム・アプリケーションの実行例 |
[Click Me!]ボタンをクリックすると、メッセージボックスが表示される。 |
●.NETプログラム内でIronRubyコードを動的に実行するには?
IronRubyの.rbファイルは、C#やVBのプログラム内から呼び出すこともできる。ここではその最も単純な例を示そう。
まず、次のようなスクリプト・コードのhello.rbファイルをCドライブの直下に配置する。
|
|
hello.rbファイル |
そして、Visual StudioでC#やVBのコンソール・アプリケーションのプロジェクトを作成し、以下のすべてのアセンブリ(.dllファイル)への参照を設定する。
- IronRuby
- IronRuby.Libraries
- IronRuby.Libraries.Yaml
- Microsoft.Scripting
- Microsoft.Scripting.Core
すべてのアセンブリは、インストールしたIronRubyの「bin」フォルダ内(本稿の例では「C:\Program Files\Microsoft SDKs\ironruby\bin\」内)にある。参照設定が完了したら、次のプログラム・コードを記述すればよい。
|
||
.NETプログラム内でIronRubyコードを動的に実行するサンプル・プログラム(上:C#、下:VB) |
IronRubyのRubyランタイムを生成して、.rbファイルを実行しているだけのシンプルなプログラムだが、これを実行すると.NETプログラム内でIronRubyコードを動的に実行できる。
次のページでは、本稿の締めくくりとして、.NET開発者なら気になるであろうVisual StudioのIDE(統合開発環境)での開発について簡単に紹介する。
INDEX | ||
[特集]初めてのIronRuby | ||
.NETでRuby開発を体験してみよう | ||
1.IronRuby開発の基本 | ||
2.IronRuby特有の機能 | ||
3.Visual Studioを活用したリッチなIronRuby開発 | ||
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|