読者です 読者をやめる 読者になる 読者になる

だいたい3分ぐらいでJRuby 〜インストールからクラス定義〜


JRuby のインストール

以下のサイトからJRubyのバイナリを取得します。
http://jruby.org/

現在のリリースは JRuby 1.4.0 となっており、Ruby 1.8.7 と互換性があります。今回は JRuby 1.4.0 Binary を使用します。jruby-bin-1.4.0.zip をダウンロードし、任意のディレクトリに解凍します。ここでは Windows を前提に C:\Program Files\jruby\jruby-1.4.0 とします。

環境変数の設定

環境変数を設定します。Winキー + Pause → 詳細設定 → 環境変数 にて以下を設定します。

JRUBY_HOME C:\Program Files\jruby\jruby-1.4.0
PATH %PATH%;%JRUBY_HOME%\bin

Win + R → cmd と入力しコマンドプロンプトを立ち上げ以下を入力します。バージョン情報が出力されれば完了です。

> jruby -v
jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (Java HotSpot(TM) Client VM 1.6.0_12) [x86-java]

Hello World

hello.rb というファイルを以下のように作成します。

puts "Hello World !!" # say hello


実行してみます。

> jruby hello.rb
Hello World !!

Hello World が出力されました。rubyでは1行に1文ずつ書く限り文末のセミコロンは不要です。またコメントは#で始まり行末まで続きます。

Hello World の改良

hello.rb を以下のように改良します。

def say_hello(name)
  result = "hello #{name} !!"
  return result
end

puts say_hello("Thom")

Rubyではインデントを2つのスペースとすることが通例です。実行結果は以下となります。

>jruby hello.rb
hello Thom !!

ここでは def キーワードにてメソッドを定義しています。メソッド名と括弧付きのメソッド引数を指定して定義します。上記ではメソッドの戻り値を明示的に return にて指定していますが、戻り値はメソッド内で最後に評価された式の値となるため以下のようにかいても同じです。

def say_hello(name)
  result = "hello #{name} !!"
end

文字列リテラル

ダブルクオートで囲まれた文字列リテラルでは #{・・} で囲まれた式の展開が行われます。#{・・} 構文にはいくらでも複雑な式を指定できます。式が単純なグローバル変数インスタンス変数・クラス変数の場合にはブレースを省略し、# のみとすることもできます。

def say_hello(name)
  $g_name = name    # $g_name はグローバル変数
  result = "hello #$g_name !!"
end

文字列リテラルはシングルクオートで囲むこともできます。シングルクオートで定義した文字列リテラルは、前述の式展開やエスケープシーケンスの置換(改行が\nなど)が行われません。

Rubyの変数名

Rubyでは変数名の先頭文字で利用用途を表します。

種別 定義
グローバル変数 $で開始 $debug
インスタンス変数 @で開始 @name
クラス変数 @@で開始 @@count

その他に以下のルールがあります。

  • クラス名・モジュール名・定数は先頭を大文字にする。
  • ローカル変数・メソッドの引数・メソッド名は全て小文字または_で始める。

クラス

クラスの定義は class〜end キーワードにより行います。

class Hello
  attr_accessor :name
  def say_hello
    puts "Hello #@name !!"
  end
end

hello = Hello.new
hello.name = "Thom"
hello.say_hello

上記を実行すると、先程までと同じ「hello Thom !!」が出力されます。
attr_accessor はクラス属性へのアクセッサを定義するショートカットです。これによりname というインスタンス変数(@name)とそのアクセッサが自動的に定義されます。読み取り専用の「attr_reader」と書き込み専用の「attr_writer」もあります。
:name という構文は name という変数の Symbol オブジェクトを返す式です。:name は変数 name の名前を意味し、コロン無しは変数の値を意味することになります。

コンストラクタ

Ruby での標準のコンストラクタ呼び出しは new です。

hello = Hello.new

コンストラクタ呼び出しはオブジェクトのメモリ領域を確保してから、そのオブジェクトの initialize メソッドを呼び出します。initialize メソッドを定義した例を見てみます(属性として年齢も加えてみましょう)。

class Hello
  def initialize(name, age)
    @name = name
    @age = age
  end
  def say_hello
    puts "Hello #@name #@age !!"
  end
end

hello = Hello.new("Mick", 50)
hello.say_hello

属性

前述の例では attr_accessor により属性へのアクセッサを定義しましたが、このショートカットを使用しないこともできます。

class Hello
  def name
    @name
  end
  def name=(name)
    @name = name
  end
end

hello = Hello.new
hello.name = "King"  # setter 呼び出し
puts hello.name      # getter 呼び出し

上記を実行すると、「King」と表示されます。getter としてnameというメソッドを定義しています。setter は等号で終わるメソッドを作成することで定義できます。

継承

継承はクラス名の後に < により親クラスを指定することで定義します。以下の例では HiHello クラスが Hello クラスを継承している例です。

class Hello
  attr_accessor :name
  def say_hello
    "Hello #@name !!"
  end
end

class HiHello < Hello
  def say_hello
    "Hi " + super
  end
end

hello = HiHello.new
hello.name = "Thom"
puts hello.say_hello

サブクラスではsuperキーワードにて親クラスの同じ名前のメソッドを呼び出すことができます。


だいたい3分ぐらいでJRuby 〜コンテナとブロック〜 - etc9に続く。