Rubyの基本的なコンテナオブジェクトには配列とハッシュがあり、ともにオブジェクトへの参照を格納します。
ここでは配列についてみてみます。Rubyの配列はPerlの無名配列と似ています。
sample.rb
str = "This is a string."
num = 0
array = [num,1,2,str]
str[-1] = '?'
num = 999
array.each do |var|
puts var
end
出力例
$ ruby sample.rb
0
1
2
This is a string?
strを更新、つまりarrayの第3要素の参照先を間接的に更新したことで、ピリオド'.'がクエスチョンマーク'?'に変更されて出力されました。
一方でnumに新しいオブジェクトを代入しても、これまでnumに代入してあったオブジェクト自体を更新したことにはならないため0は0のままです。
sample.rb
array = [0,1,2,3,4,5,6,7,8,9]
p array[2,3]
p array[2..4]
出力例
$ ruby sample.rb
[2, 3, 4]
[2, 3, 4]
sample.rb
array = [0,1,2]
array[10] = 9 # 残りはnilで埋まります。
p array
array[3..10] = nil,nil # [3],...,[10]がnil,nilで置換されます。
p array
array[3,2] = 'a','b','c','d' # [3],[4],[5]がa,b,c,dで置換されます。
p array
出力例
$ ruby sample.rb
[0, 1, 2, nil, nil, nil, nil, nil, nil, nil, 9]
[0, 1, 2, nil, nil]
[0, 1, 2, "a", "b", "c", "d"]
配列の比較は全要素が等しい場合にtrueとなります。
sample.rb
a = [1,2,'a']
b = [1,2,'a']
puts "a == b" if a==b
出力例
$ ruby sample.rb
a == b
Arrayオブジェクトの便利なメソッドを示します。
sample.rb
array = [1,2,3]
p array.size
p array.length
array *= 3
p array
p array.include? 2
p array.sort
p array.uniq
p array # もとの配列はそのまま
array.sort! # '!': 配列を破壊的に操作
p array
array.uniq!
p array
# 結合して文字列生成
expression = array.join(' + ')
# inject(初期値), 配列をイテレート, subtotal: 前回ループの結果または初期値, val: 配列要素
total = array.inject(0){|subtotal, val| subtotal+val}
puts "#{expression} = #{total}"
# push,pop,unshift,shift
array = ['middle']
array.push 456
array.unshift 123
p array
p array.pop
p array
p array.shift
p array
出力例
3
3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
true
[1, 1, 1, 2, 2, 2, 3, 3, 3]
[1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 1, 1, 2, 2, 2, 3, 3, 3]
[1, 2, 3]
1 + 2 + 3 = 6
[123, "middle", 456]
456
[123, "middle"]
123
["middle"]
sample.rb
array = [1,2,3]
array.each do |val|
puts val
end
array.each_with_index do |val,i|
puts "#{i}: #{val}"
end
出力例
$ ruby sample.rb
1
2
3
0: 1
1: 2
2: 3
Perlなどにもあるmapが実装されています。
sample.rb
array = [1,2,3]
p array.map{|val| val*2}
出力例
$ ruby sample.rb
[2, 4, 6]
メソッドを一つ呼ぶだけのシンプルなケースであればショートカット記法があります。
sample.rb
array = [1,2,3]
p array.map{|val| val.class}
p array.map(&:class)
出力例
$ ruby sample.rb
[Fixnum, Fixnum, Fixnum]
[Fixnum, Fixnum, Fixnum]
Perlなどにおけるgrepに相当するselectが実装されています。
sample.rb
array = [1,2,3,4,5]
p array.select{|val| val%2==0}
出力例
$ ruby sample.rb
[2, 4]
何をもとに評価してソートするかを記述できます。
sample.rb
array = [['a',100],['c',200],['b',50]]
p array.sort{|x,y| x[1] <=> y[1]}
p array.sort{|x,y| x[0] <=> y[0]}
出力例
$ ruby sample.rb
[["b", 50], ["a", 100], ["c", 200]]
[["a", 100], ["b", 50], ["c", 200]]