特集:初めてのIronRuby

.NETでRuby開発を体験してみよう

デジタルアドバンテージ 一色 政彦
2009/03/11
Page1 Page2 Page3

IronRuby特有の機能

 最初に、Ruby標準ライブラリについて押さえておこう。

Ruby標準ライブラリを利用するには?

 Ruby標準ライブラリとは、Ruby言語に標準で添付されている外部ライブラリである(このため、一般的には「添付ライブラリ」と呼ばれる)。なお、組み込み変数/関数/クラスなどの「組み込みライブラリ」と「標準ライブラリ」は異なるので注意してほしい。先ほどのputs関数は、Ruby言語自体に搭載されている「組み込み関数」である。

 IronRubyでは、組み込みライブラリに加え、Ruby標準ライブラリが最初から使用できる状態になっている。例えば次のコードは、標準ライブラリのDateクラスのクラス・メソッド「today」を使って、今日の日付を出力している例だ(「クラス・メソッド」とは、C#におけるstaticメソッド、VBにおけるSharedメソッド、つまり静的メソッドのことだ。これに対し、クラスをインスタンス化したオブジェクトのメソッドは「インスタンス・メソッド」と呼ばれる)。

require 'date'
puts Date.today  #=> 2009-03-11
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ファイルは、絶対パスを使って次のように指定することもできる。

require 'C:\Program Files\Microsoft SDKs\ironruby\lib\ruby\1.8\date.rb'

 このようにrequire関数に渡す実引数はファイル・パスである。そのため、一重引用符(')で指定されることが多い。

【コラム】IronRubyにおけるライブラリの利用設定

 IronRubyでは、対話型コンソール/Rubyインタプリタであるir.exeの構成ファイル(ir.exe.configファイル)内に、Ruby標準ライブラリの設定がある。ir.exe.configファイルを開くと、例えば次のように、LibraryPathsオプションにRuby標準ライブラリへのディレクトリ・パスが設定されている。

<?xml version='1.0' encoding='UTF-8'?>
<configuration>
  ……省略……
 
  <microsoft.scripting>
    ……省略……

    <options>
      <set language='Ruby' option='LibraryPaths' value='..\lib\IronRuby;..\lib\ruby\site_ruby\1.8;..\lib\ruby\site_ruby;..\lib\ruby\1.8'/>
    </options>

  </microsoft.scripting>

</configuration>
ir.exeの構成ファイル(ir.exe.configファイル)

 このLibraryPathsオプションの値は、ライブラリの場所を示すディレクトリ・パスの配列であり、コード内からは「$:」もしくは「$LOAD_PATH」という組み込み変数で取得できる。例えば、インタラクティブ・モードで、どのようなライブラリ・パスからライブラリをロードできるかを調べるには、次のコードを実行すればよい。

puts $:

.NETライブラリを利用するには?

 続いて、MRIではなくIronRubyを使う大きな理由の1つである「.NET Frameworkの基本クラス・ライブラリの利用」について紹介しよう。

 この場合にはまず、利用したいクラスが含まれている.NETアセンブリへの参照が必要になるが、これには先ほども出てきた「require」関数を使う。(基本的には)実引数として「.NETアセンブリの厳密名」を指定する必要がある。

 そして、クラス名を記述する際の、名前空間における階層の区切りは、Ruby言語では「::」を用いる(=C#やVBの「.」と同じ)。

 例えば、「Hello World!」とコンソール出力するには、次のようなコードになる。

require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
require 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System::Console.WriteLine("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」クラスのエイリアスを作成して、それを利用するには、次のようなコードになる。

Console = System::Console
Console.WriteLine("Hello World!")
クラスのエイリアスを作成するサンプル・コード

Windowsフォーム・アプリケーションを開発するには?

 続いては、IronRubyでWindowsフォーム・アプリケーションを開発する方法を紹介しよう。ただし、(筆者が試した限り)現時点のir.exeの実装ではWindowsフォームの場合、日本語が文字化けしてしまうようなので注意してほしい(ちなみにir.exeの代わりに、後述の「Ruby In Steel for IronRuby」に含まれる「rbx.exe」を使うと文字化けしなかった)。

 次のコードは、ボタンが1つだけ配置されたWindowsフォームのアプリケーションの実装例である。

require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
require 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
require 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

class RubyForm < System::Windows::Forms::Form

  def initialize
    self.Text = "Windows Form on IronRuby"

    btn = System::Windows::Forms::Button.new()
    btn.Location = System::Drawing::Point.new(50, 50)
    btn.Text = "Click Me!"

    btn_Click = Proc.new() { |sender, e|
      System::Windows::Forms::MessageBox.Show("Hello World!")
    }
    btn.Click(&btn_Click)

    self.Controls.Add(btn)
  end

end

System::Windows::Forms::Application.Run(RubyForm.new)
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ドライブの直下に配置する。

puts "Hello World!"
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\」内)にある。参照設定が完了したら、次のプログラム・コードを記述すればよい。

class Program
{
  static void Main()
  {
    var runtime = IronRuby.Ruby.CreateRuntime();
    runtime.ExecuteFile(@"C:\hello.rb");
  }
}
Module Program

  Sub Main()
    Dim Runtime = IronRuby.Ruby.CreateRuntime()
    Runtime.ExecuteFile("C:\hello.rb")
  End Sub

End Module
.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開発


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間