第3回輪講3. 1.配列
値の列で、添字によって値にアクセスできるよ
うになっているもの
配列の要素は全て同じクラスである必要はなく、
任意のタイミングで変更できる
配列のサイズは要素を追加すると、必要に応じ
て伸びる
配列の末尾よりも後ろの要素に値を代入すると、
間にnil要素を挟んで自動的に拡張される。しか
し、先頭よりも手前の要素に値を代入しようと
するとエラーになる
4. 配列リテラルは、全体が角かっこで囲まれ、カンマ
で区切られた値のリストである
[1,2,3] #3個のFixnumオブジェクトを保持す
る配列
[-10…0,0…10, ] #2個の範囲から構成される配列。
#末尾のカンマは許される
[[1,2],[3,4],[5]] #ネストされた配列の配列
[x+y,x-y,x*y] #配列要素としては任意の式が使える
[] #空配列のサイズは0
・ %w、%Wは配列リテラルを意味する
・ セパレータの中では、配列要素の文字列を囲む引用
符は不要であり、要素の間にカンマを入れる必要もない
・ 配列要素はカンマで区切られる
words = %w[this is a test] #[„this‟, „is‟, „a‟,
6. ・配列要素の値は、角かっこの中に単一の整数(添字)
を入れたものを使って取得する
a = [0, 1, 4, 9, 16] #添字の自乗を格納する配列
a[0] #先頭の要素は0
a[-1] #末尾の要素は16
a[8] #末尾を越えて読もうとするとnilが返され
る
a[-8] #先頭より手前を読もうとしてもnilが返さ
れる
・上記の式は代入の左辺としても使うことができる
a[0] = “zero” #aは[“zero”, 1, 4, 9, 16]
a[-1] = 1..16 #aは[“zero”, 1, 4, 9, 1..16]
a[-10] = 100 #エラー。
#配列の先頭よりも手前の要素に代入
7. ・先頭インデックスと要素数を表す2個の整数やRange
オブジェクトを添字とすることもできる
a = („a‟..‟e‟).to_a #Rangeが[„a‟, „b‟, „c‟, „d‟, „e‟]に変換され
るa[1,1] #[„b‟] : 要素が1個の配列
a[-2,2] #[„d‟, „e‟] : 末尾の2個の要素
a[0..2] #[„a‟, „b‟, „c‟] : 先頭の3個の要素
・これらの式を代入の左辺として使うと、部分配列を
右辺の配列の要素に置き換えることができる。
・この基本操作は、挿入や削除にも使える
a[0,2] = [„A‟, „B‟] #aは[„A‟, „B‟, „c‟, „d‟, „e‟]になる
a[2…5] = [„C‟, „D‟, „E‟] #aは[„A‟, „B‟, „C‟, „D‟, „E‟]になる
a[0,0] = [1,2,3] #aの先頭に要素を挿入する
a[-1,1] = [„Z‟] #末尾の要素を別の要素に書き換える
8. ・+を使えば、2つの配列を結合できる
a = [1, 2, 3] + [4, 5] #[1, 2, 3, 4, 5]
a = a + [ [6, 7, 8] ] #[1, 2, 3, 4, 5, [6, 7, 8] ]
a = a + 9 #エラー。右辺は配列でなければならない
・+演算子は、両辺の要素を含む新しい配列を作成す
る
・既存の配列の末尾に新しい要素を追加したい場合は
<<を使う
・複数の要素を末尾に追加したい場合はconcatを使う
a=[] #空配列からスタートする
a << 1 #aは[1]になる
a << 2 << 3 #aは[1, 2, 3]になる
a << [4, 5, 6] #aは[1, 2, 3, [4, 5, 6] ]になる
9. ・-演算子は、片方の配列からもう片方の配列を減算す
る
・右辺の要素は、配列内のどの位置にあっても構わない
[„a‟, „b‟, „c‟, „b‟, „a‟] – [„b‟, „c‟, „d‟] #[„a‟, ‟a‟]
・Stringクラスと同様に、Arrayでも乗算演算子を使うと、
反復の意味になる
a = [0] * 8 #[0, 0, 0, 0, 0, 0, 0, 0]
・|は引数を連結し、重複する要素を全て取り除く
・&は両方の引数配列に含まれている要素を集め、重複
を取り除いた配列を返す
a = [1, 1, 2, 2, 3, 3, 4] ; b = [5, 5, 4, 4, 3, 3,
2]
a|b #[1, 2, 3, 4, 5] : 重複が取り除かれている
b|a #[5, 4, 3, 2, 1] : 要素は同じだが、順序は逆
a&b #[2, 3, 4]
10. Arrayクラスの役立つメソッド
・配列の要素を逐次的に処理するために使われる
eachイテレータ
a = („A‟..‟Z‟).to_a #英字の配列を作る
a.each {|x| print x}
#1度に1字ずつアルファベットを出
力する
・調べておくと役に立つArrayメソッド
clear, compact!, delete_if, each_index, empty?, fill,
flatten!, include?, index, join, pop, push, reverse,
reverse_each, rindex, shift, sort, sort!, uniq!,
unshift
11. 2.ハッシュ
キーと呼ばれるオブジェクトの集合を保持し、
個々のキーに値を対応付けているデータ構造
キーを値にマッピングするので、マップとも
呼ばれる
個々のキーから値を連想するように導き出す
ので、連想配列と呼ばれることもある
14. ・ハッシュキーとして文字列よりもSymbolオブジェク
トの方が効率的に使える
numbers = { :one => 1, :two => 2, :three => 3 }
・Symbolとは、intentされたイミュータブルな文字列
で、プレフィックスとしてコロンが付けられた識別子
という形で記述される
numbers = { :one => 1, :two => 2, }
#余分なカンマは無視される
・Ruby1.9は、キーがシンボルのときには、コロンを
ハッシュキーの末尾に移動すると矢印を省略できる
numbers = { one: 1, two: 2,three: 3 }
・ただし、ハッシュキー識別子とコロンの間にスペー
スを入れてはならない
36. ③クラスをチェック(直接比較)
o.class == String #oがStringならtrue
・instance_of?メソッドでも同じことをする
o.instance_of? String #oがStringならtrue
④オブジェクトがそのクラスのサブクラスのインスタ
ンスかどうか
x=1 #この値で操作する
x.instance_of? Fixnum #true: Fixnumのインスタンス
x.instance_of? Numeric #false: x.instance_of? では継承関係が
分からない
x.is_a? Fixnum #true: xはFixnum
x.is_a? Integer #true: xはInteger
x.is_a? Numeric #true: xはNumeric
x.is_a? Comparable #true: ミックスインモジュールにも対応
x.is_a? Object #xがどのような値でもtrue
40. 14.オブジェクトの順序
・クラスは< = >演算子を実装して順序を定義する
1<=>5 # -1: 左辺が右辺よりも小さい
5<=>5 # 0: 両辺が等しい
9<=>5 # 1: 左辺が右辺より大きい
“1” < = > 5 # nil: 整数と文字列は比較できない
・< = >演算子がnilを返した場合、比較演算子はfalseを
返す(Floatの特殊値NaNなど)
nan = 0.0/0.0#0割る0は数値ではない(not a number)
nan < 0 #false: 0より小さくない
nan > 0 #false: 0より大きくない
nan == 0 #false: 0と等しくない
nan == nan #false: 自分自身とさえ等しくない
42. 暗黙の変換
to_int #整数に近くなりたいオブジェクトのためのメ
ソッド
to_str #文字列に近くなりたい
to_ary #配列に近くなりたい
to_hash #ハッシュに近くなりたい
・実装されているものはあまりない
変換関数
・kernelモジュールは、グローバルな変換関数として動
作する4種類の変換メソッドを定義している
Array, Float, Integer, String
・Integer関数は、引数をFixnumかBignumに変換する
・末尾に数字以外の文字が含まれているものは認めな
い