3.1 配列の生成とメソッド

配列を表すArrayオブジェクトは、newメソッドを呼び出すことで生成することが出来る(オブジェクトについては第7章で説明)。 メソッドの引数には配列の大きさを指定する必要がある。初期化ではすべての要素にnil(値が無いことを示す値)で埋められる。 C言語同様に[]で添字を指定して参照したり、代入したりすることができる。

irb(main):001:0> arr = Array.new(3) // 大きさ3の配列
=> [nil, nil, nil]
irb(main):002:0> arr[0] = 1
=> 1
irb(main):003:0> arr
=> [1, nil, nil]

配列はリテラル表記(直接的な書き方)ができ、それによって配列を生成することもできる。 また、添字が循環しており-1で末尾の要素を指定することなどもできる。

irb(main):001:0> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):002:0> arr[-1]
=> 10

ちなみに、Range型は配列型に変換するメソッドを備えている。

irb(main):001:0> (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

冒頭で述べた通り配列はオブジェクトなので、配列の使えるメソッドを一気に紹介する。 pメソッドはオブジェクトの形を維持したまま、出力するとても便利なメソッドだ。

arr.rb (REPLで確認しても良い)

p "hogehoge" #=> "hogehoge" ←文字列の形を維持している。
array = ['a', 'b', 'c']
p arr #=> ["a", "b", "c"] ← 配列の形を維持している。
p arr.length #=> 3 配列の長さを返す。
p arr *= 2 #=> ["a", "b", "c", "a", "b", "c"]
p arr.include? "c" #=> true 特定の値を含むかどうか
p arr.sort #=> ["a", "a", "b", "b", "c", "c"] 配列を並び替える
arr.uniq! #=> ["a",  "b",  "c"] 重複要素を削除
p arr.join(":") #=> "a:b:c" 指定した文字列で要素を区切った文字列を生成

ここで、メソッドの名前について注目してもらいたい。?と!で終わっているものがあると思われる。 これは特別な機能ではなく、単純にメソッド名に記号が使うことができるだけである。 習慣として?で終わるメソッドは真偽値(true, false)を返すメソッド、!で終わるメソッドは破壊的な処理を行うメソッドである。 破壊的な処理とは、元のオブジェクトの状態を変更してしまうようなメソッドをあらわす。 大体の場合は非破壊的メソッドも対で用意されていることが多い。sortuniqメソッドがこれに当たる。

irb(main):001:0> arr = [1, 1, 3, 2, 4, 5]
=> [1, 1, 3, 2, 4, 5]
irb(main):002:0> p arr.sort
[1, 1, 2, 3, 4, 5]          # 表示はソート済み
=> [1, 1, 2, 3, 4, 5]       # 戻り値もソート済みだが・・・
irb(main):003:0> p arr
[1, 1, 3, 2, 4, 5]          # 元の配列は配列は変更されていない(非破壊的メソッド)
irb(main):004:0> arr.sort!  # しかし破壊的なメソッドを呼び出すと・・・
=> [1, 1, 2, 3, 4, 5]
irb(main):005:0> p arr      # 元の配列も変更されてしまう(破壊的メソッド)
[1, 1, 2, 3, 4, 5]

配列のメソッドを利用して以下の問題を解いてみよう。

results matching ""

    No results matching ""