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

だいたい3分ぐらいでJRuby 〜コンテナとブロック〜


配列

Rubyでは組み込みの Array クラスが配列を表します。配列を作成するにはリテラルを使用するか、明示的に Array オブジェクトを生成します。

a = [ 3.14, "pie", 99]
a.class    # Array
a.length   # 3
a[2]       # pie
a[3]       # nil(Rubyではnilもオブジェクト)

b = Array.new
b[0] = 3.14
b[0]       # 3.14

配列は[]演算子によって参照します。負数のインデックスでアクセスすると、配列の終わりから数えた位置のオブジェクトが参照できます。


配列は[start, count]という2つの数値の組で指定することができます。

a = [0, 1, 2, 3, 4, 5]
a[1, 3]    # [1, 2, 3] インデックス1から3個のオブジェクトの参照

また、配列は範囲で参照することもできます。

a = [0, 1, 2, 3, 4, 5]
a[2..4]    # [2, 3, 4] インデックス1から4オブジェクトの参照
a[2...4]   # [2, 3] ...は終了位置を含まない


配列への代入は = 演算子により行います。代入によりすき間ができた場合にはnilで埋められます。= のインデックスに開始位置と数や、範囲を指定した場合には、対応する配列内の要素が置き換えられます。


単語の配列を%wを使うと簡単に作成できます。

# a = [ 'ant', 'bee', 'cat', 'dog' ] と同意
a = %w{ ant bee cat dog }

ハッシュ

Rubyでは組み込みの Hash クラスによりハッシュを表します。ハッシュリテラルは キー => 値 の形で指定します。

h = {'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
h.length      # 3
h['cat']      # feline
h['cat'] = 9  # 代入

存在しないキーを指定すると、デフォルトでnilを返却します。デフォルトを指定する場合は以下のようにコンストラクタで指定します。

h = Hash.new(0)   # 該当キーが存在しない場合は0を返却する

コードブロック

コードブロックとは、ブレース{} または do〜end で囲まれたコードのかたまりです。通常は1行のブロックにはブレースを使用し、複数行のブロックには do〜end を使用します。
コードブロックはメソッドに渡すことができます。以下の例で見ていきましょう。

def code_block
  puts "before yield"
  yield
  puts "after yield"
end

code_block { puts "from yield" }

上記コードを実行すると以下の出力が得られます。

before yield
from yield
after yield

code_block というメソッドに { puts "from yield" } というコードブロックを渡し、このコードブロックが yield により実行されています。


コードブロックはパラメータを受け取ることもできます。

def code_block
  puts "before yield"
  yield(9)
  puts "after yield"
end

code_block { |num| puts "from yield #{num}" }

コードブロックの先頭に||で受け取る引数を定義し、コードブロック内で利用することができます。メソッド内では yield に () で引数を渡します。引数が複数ある場合はカンマで区切って渡すことができます。出力は以下のようになります。

before yield
from yield 9
after yield

イテレータ

Ruby では前述のコードブロックを利用してイテレータによる繰り返し処理が非常に簡素に実現されています。以下の例では配列 Array の each メソッドにコードブロックを渡しています。

[1, 3, 5, 7, 9].each { |i| print i }

eachメソッド内では単純に配列の各要素について、要素を引数として yield を呼び出しており、以下のような出力が得られます。

13579


inject メソッドにより累計を得たりできます。

s = [1, 3, 5, 7, 9].inject do |sum, element|
    puts "#{sum} + #{element} "
    sum + element
end
puts s
1 + 3
4 + 5
9 + 7
16 + 9
25

JRubyからJavaの呼び出し

気づけば Ruby の文法の説明になってしまっていたので、ここら辺でJRubyからJavaを呼び出してみます。

require 'java'
import java.util.ArrayList

list = ArrayList.new
list.add("hoge")
puts list.toString
puts list.to_string
puts list.to_s

JRuby から java コードを呼び出すには require 'java' とします。出力結果は以下のようになります。toString メソッドに対するエイリアスが定義されているため、3つの toString メソッドは同じ結果となります。

[hoge]
[hoge]
[hoge]

続く・・