データ型

 配列、ハッシュ、時刻のデータ型について説明します。

 

配列

配列はデータ(オブジェクト)を一列に並べた集まりを表すデータ型です。Rubyでは、配列内の各要素のデータ型は異なっていても構いません。


配列を生成する方法はいくつか存在します。以下に示します。

irb(main):001:0> a1 = [1, 2, "Ruby"]      #カンマで区切りで要素を列記
=> [1, 2, "Ruby"]
irb(main):002:0> a2 = Array[1, 2, "Ruby"] #Arrayクラスから生成
=> [1, 2, "Ruby"]
irb(main):003:0> a3 = Array.new(3)        #Array.new(要素数)で生成し
=> [nil, nil, nil]
irb(main):004:0> a3[0] = 1                #配列[インデックス]で代入
=> 1
irb(main):005:0> a3[1] = 2
=> 2
irb(main):006:0> a3[2] = "Ruby"
=> "Ruby"
irb(main):007:0> a4 = %w(Ruby Java Lisp) #スペース区切りの文字列から生成
=> ["Ruby", "Java", "Lisp"]

 

 配列要素の参照・変更は[ ]を用います。

irb(main):001:0> a = [1, 2, "Ruby", "Java"]
=> [1, 2, "Ruby", "Java"]
irb(main):002:0> a[2]           #配列[インデックス]でアクセス
=> "Ruby"
irb(main):003:0> a[1,2]        #配列[インデックス, 要素数]でアクセス
=> [2, "Ruby"]
irb(main):004:0> a[1..3]        #範囲オブジェクトも指定可能
=> [2, "Ruby", "Java"]
irb(main):005:0> a[1] = 100    #配列の要素の内容を変更
=> 100
irb(main):006:0> p a
[1, 100, "Ruby", "Java"]
=> [1, 100, "Ruby", "Java"]
irb(main):007:0> a[1, 2] = ["Perl", "Lisp"] #配列を代入して変更
=> ["Perl", "Lisp"]
irb(main):008:0> p a
[1, "Perl", "Lisp", "Java"]
=> [1, "Perl", "Lisp", "Java"]

 

 配列の全ての要素に対しての処理は以下のようにします。処理はブロック(後述)の中に記述します。

irb(main):001:0> a = ["Ruby", "Java", "C++"]
=> ["Ruby", "Java", "C++"]
irb(main):002:0> a.each {|val| puts val}
Ruby
Java
C++
=> ["Ruby", "Java", "C++"]
irb(main):003:0> a.each_with_index {|val, i| puts "#{val}, #{i}"}
Ruby, 0
Java, 1
C++, 2
=> ["Ruby", "Java", "C++"]

 

 配列をキューやスタックのようなデータ構造と見立てて、要素の追加・削除をすることができます。

irb(main):001:0> a = ["Ruby", "Java", "Perl"]
=> ["Ruby", "Java", "Perl"]
irb(main):002:0> a.push "Python" #配列の末尾に要素を追加
=> ["Ruby", "Java", "Perl", "Python"]
irb(main):003:0> a.pop           #配列の末尾の要素を抽出し元配列から削除
=> "Python"
irb(main):004:0> p a
["Ruby", "Java", "Perl"]
=> ["Ruby", "Java", "Perl"]
irb(main):005:0> a.unshift "C++" #配列の先頭に要素を追加
=> ["C++", "Ruby", "Java", "Perl"]
irb(main):006:0> a.shift        #配列の先頭の要素を抽出し元配列から削除
=> "C++"
irb(main):007:0> p a
["Ruby", "Java", "Perl"]
=> ["Ruby", "Java", "Perl"]

 

配列の要素の削除の方法として、次のような方法があります。

irb(main):001:0> a = ["Ruby", "Java", "Perl", "Python", "Lisp"]
=> ["Ruby", "Java", "Perl", "Python", "Lisp"]
irb(main):002:0> a.delete("Java") #値を指定して削除
=> "Java"
irb(main):003:0> p a
["Ruby", "Perl", "Python", "Lisp"]
=> ["Ruby", "Perl", "Python", "Lisp"]
irb(main):004:0> a.delete_at(1)   #インデックスを指定して削除
=> "Perl"
irb(main):005:0> p a
["Ruby", "Python", "Lisp"]
=> ["Ruby", "Python", "Lisp"]
irb(main):006:0> a.delete_if{|lang| lang.size >= 5} #条件指定して削除
=> ["Ruby", "Lisp"]
irb(main):007:0> p a
["Ruby", "Lisp"]
=> ["Ruby", "Lisp"]
irb(main):008:0> a.clear         #配列の要素をすべて削除
=> []
irb(main):009:0> p a
[]
=> []

 

 配列に対してソートする機能もあります。並び順はブロック(後述)で変更することができます。

irb(main):001:0> a = [2, 33, 1, 3, 11, 22]
=> [2, 33, 1, 3, 11, 22]
irb(main):002:0> a.sort                         #数の昇順でソート
=> [1, 2, 3, 11, 22, 33]
irb(main):003:0> a.sort{|x,y| x.to_s <=> y.to_s} #文字列としてソート
=> [1, 11, 2, 22, 3, 33]
irb(main):004:0> a.sort_by{|x| -x}                #数の降順でソート
=> [33, 22, 11, 3, 2, 1]

 

 配列の要素に対して、集合演算も行うことができます。

irb(main):001:0> a1 = ["Ruby", "Perl", "Python"]
=> ["Ruby", "Perl", "Python"]
irb(main):002:0> a2 = ["Ruby", "Perl", "Lisp"]
=> ["Ruby", "Perl", "Lisp"]
irb(main):003:0> a1 & a2         #a1とa2の積集合
=> ["Ruby", "Perl"]
irb(main):004:0> a1 | a2          # a1とa2の和集合
=> ["Ruby", "Perl", "Python", "Lisp"]
irb(main):005:0> a1 - a2          # a1からa2を引いた差集合
=> ["Python"]

 

 その他、配列でよく使うメソッドとして以下のようなものがあります。

irb(main):001:0> a = ["C++", "Ruby", "Python", "Java"]
=> ["C++", "Ruby", "Python", "Java"]
irb(main):002:0> a.size                    #配列の要素数
=> 4
irb(main):003:0> a.reverse                #配列を逆転
=> ["Java", "Python", "Ruby", "C++"]
irb(main):004:0> a.find{|l| l.length == 4}  #最初に条件に合うものを検索
=> "Ruby"
irb(main):005:0> a.find_all{|l| l.length == 4} #条件に合うもの全て検索
=> ["Ruby", "Java"]
irb(main):006:0> a.map{|lang| lang * 2}    #配列の各要素の置き換え
=> ["C++C++", "RubyRuby", "PythonPython", "JavaJava"]
irb(main):007:0> b = ["Lisp", "Haskell"]
=> ["Lisp", "Haskell"]
irb(main):008:0> a + b                      #配列の連結
=> ["C++", "Ruby", "Python", "Java", "Lisp", "Haskell"]
irb(main):009:0> ["Ruby", "Java", "Ruby", "C++"].uniq #重複要素の除去
=> ["Ruby", "Java", "C++"]
irb(main):010:0> [nil, "Java", "Ruby", nil].compact  #nil要素の除去
=> ["Java", "Ruby"]

 

 

 ハッシュ

ハッシュとはキーと値を対にもつデータの集合です。ハッシュではインデックスの代わりにキーを指定することで対応する値を取得します。


ハッシュを生成する方法として以下のようなものがあります。「=>」の前が要素のキーであり後ろが要素の値となります。

irb(main):001:0> h = {"John"=>40, "Paul"=>42} #「キー=>値」のペアを列記
=> {"John"=>40, "Paul"=>42}
irb(main):002:0> h = Hash["John"=>40, "Paul"=>42] #Hashクラスから生成
=> {"John"=>40, "Paul"=>42}
irb(main):003:0> h = Hash["John", 40, "Paul", 42] #Hashクラスから生成
=> {"John"=>40, "Paul"=>42}
irb(main):004:0> h = Hash.new #空のハッシュを作成し要素を入れることも可能
=> {}
irb(main):005:0> h[“John”] = 40
=> 40
irb(main):006:0> p h
{"John"=>40}
=> {"John"=>40}
irb(main):007:0> h = {John: 40, Paul: 42} #シンボルをキーとして生成
=> {:John=>40, :Paul=>42}

 

 ハッシュ要素の値は[ ]を使って参照します。キーや値のリストを配列で取得することもできます。

irb(main):001:0> h = {"John" => 40, "Paul" => 42}
=> {"John"=>40, "Paul"=>42}
irb(main):002:0> h["Paul"] #キーで値を取得
=> 42
irb(main):003:0> h["Ringo"] #キーに対する値がないときはnil
=> nil
irb(main):004:0> h.keys      #キーのリスト
=> ["John", "Paul"]
irb(main):005:0> h.values   #値のリスト
=> [40, 42]
irb(main):006:0> h.to_a     #キーと値のリスト
=> [["John", 40], ["Paul", 42]]

 

 ハッシュの全ての要素に対して処理を行う時は、ブロックを指定します。

irb(main):001:0> h = {"John" => 40, "Paul" => 42}
=> {"John"=>40, "Paul"=>42}
irb(main):002:0> h.each{|k, v| puts "#{k}, #{v}"} #各キーと値の処理
John, 40
Paul, 42
=> {"John"=>40, "Paul"=>42}
irb(main):003:0> h.each_key{|k| puts k}   #ハッシュの各キーに対する処理
John
Paul
=> {"John"=>40, "Paul"=>42}
irb(main):004:0> h.each_value{|v| puts v} #ハッシュの各値に対する処理
40
42
=> {"John"=>40, "Paul"=>42}

 

 指定したキーまたは値がハッシュに存在するかどうかを調べるには以下のようにします。

irb(main):001:0> h = {"John" => 40, "Paul" => 42}
=> {"John"=>40, "Paul"=>42}
irb(main):002:0> h.has_key? "George"     #キーがあるか?
=> false
irb(main):003:0> h.has_value? 40         #値があるか?
=> true

 

 ハッシュの要素を削除するには次のようにします。

irb(main):001:0> h={"John"=>40,"Paul"=>42,"George"=>43,"Ringo"=>40}
=> {"John"=>40, "Paul"=>42, "George"=>43, "Ringo"=>40}
irb(main):002:0> h.delete("John")        #キーを指定して削除
=> 40
irb(main):003:0> p h
{"Paul"=>42, "George"=>43, "Ringo"=>40}
=> {"Paul"=>42, "George"=>43, "Ringo"=>40}
irb(main):004:0> h.delete_if{|key,value| value == 40} #条件指定で削除
=> {"Paul"=>42, "George"=>43}
irb(main):005:0> h.clear                  #要素を全部削除
=> {}
irb(main):006:0> p h
{}
=> {}

 

 この他によく使うメソッドとして以下のようなものがあります。

irb(main):001:0> h = {"John" => 40, "Paul" => 42, "Geroge" => 43}
=> {"John"=>40, "Paul"=>42, "Geroge"=>43}
irb(main):002:0> h.size     #ハッシュの要素数
=> 3
irb(main):003:0> h.empty?     #ハッシュが空かどうか?
=> false
irb(main):004:0> h.invert    #値からキーへのハッシュを返す
=> {40=>"John", 42=>"Paul", 43=>"Geroge"}
irb(main):005:0> h.sort      #ハッシュのキーでソートし配列で返す
=> [["Geroge", 43], ["John", 40], ["Paul", 42]]
irb(main):006:0> h2 = {"Ringo" => 40}
=> {"Ringo"=>40}
irb(main):007:0> h.merge h2  #ハッシュの内容をマージする(非破壊的)
=> {"John"=>40, "Paul"=>42, "Geroge"=>43, "Ringo"=>40}
irb(main):008:0> p h
{"John"=>40, "Paul"=>42, "Geroge"=>43}
=> {"John"=>40, "Paul"=>42, "Geroge"=>43}
irb(main):009:0> h.update h2 #ハッシュの内容をマージする(破壊的)
=> {"John"=>40, "Paul"=>42, "Geroge"=>43, "Ringo"=>40}
irb(main):010:0> p h
{"John"=>40, "Paul"=>42, "Geroge"=>43, "Ringo"=>40}
=> {"John"=>40, "Paul"=>42, "Geroge"=>43, "Ringo"=>40}

 

 

時刻

 Rubyでは時刻を表すデータ型のTimeクラスが用意されています。下は使い方の概要です。

irb(main):001:0> t = Time.now                  #現在時刻を取得
=> 2012-01-23 01:23:45 +0900
irb(main):002:0> t.strftime("%Y/%m/%d %H:%M:%S") #時刻の書式化
=> "2012/01/23 01:23:45"
irb(main):003:0> t1 = Time.local(2012,1,1,0,0) #地方時で任意時刻を設定
=> 2012-01-01 00:00:00 +0900
irb(main):004:0> t2 = t1 + 3600                #3600秒後をt2に設定
=> 2012-01-01 01:00:00 +0900
irb(main):005:0> puts t2                       #t2はt1の1時間後に
2012-01-01 01:00:00 +0900
=> nil

 

 以上でRubyで使われるデータ型の説明は終わりです。続いて、Rubyの正規表現について説明します。