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

初めてのruby 基本〜配列

初めてのrubyです。


自分用メモ

前提

全てオブジェクト
p "test".class    #=>Stringクラス
p 1.class         #=>Fixnumクラス
p 1.class.class   #=>Classクラス
p関数は開発時に変数内部見るのに便利
代入演算子は毎回オブジェクトを作る。
1: a = 1
2: a = 1
  • 1と2のaは別のオブジェクト。
1: a = "test"
2: p a.object_id    #=>-604044008
3: a = "test"
4: p a.object_id    #=>-604044028

こうすれば分かる。
object_idは別。

実行時に評価される
def hoge
  p "hoge"
end
hoge

これはOK

fuga
def fuga
  p "fuga"
end

これはエラー

1.8系と1.9系は相当違うらしい
RubyGemsを RubyGames に空目していたのはいい思い出

配列

リテラルは、[]
a = ["a",1,3]
添え字でも入力可能
  • 範囲外の添え字も自動生成される
a = [1,2]
a[2] = 3
a[4] = 5
p a          #=>[1, 2, 3, nil, 5]
  • 添え字の範囲指定もできる
a = [1,2]
a[0] = 3
a[4] = "4"
a[0,3] = 'a', 'b', 'c'
p a          #=>["a", "b", "c", nil, "4"]
マイナスの添え字も可能
a = [0,1,2,3,4,5]
p a[-1]      #=>5
p a[-3]      #=>3
添え字の範囲指定
  • [n..n]は末尾を含む
  • [n...n]は末尾を含まない
c = [0,1,2,3,4,5,6,7,8,9]
p c[0..3]         #=>[0, 1, 2, 3]
p c[0...3]        #=>[0, 1, 2]
p c[1...7]        #=>[1, 2, 3, 4, 5, 6]
p c[-2...2]       #=>[]
p c[-7...7]       #=>[3, 4, 5, 6]
配列のメソッド
  • length
  • size
  • *=
  • sort
  • include
  • uniq
a = [1,2,3,4]
p a.length          #=>4
p a.size            #=>4
p a *= 2            #=>[1, 2, 3, 4, 1, 2, 3, 4]
p a.sort            #=>[1, 1, 2, 2, 3, 3, 4, 4]
p a.include?(1)     #=>true
p a.uniq            #=>[1, 2, 3, 4]
p a                 #=>[1, 2, 3, 4, 1, 2, 3, 4]
a.uniq!             #元の配列を更新
p a                 #=>[1, 2, 3, 4]
配列のイテレータ
  • eachの使い方

do から end までが繰り返し。

hoge パイプに囲まれた文字列に配列要素が一つずつ入ってくる
a = ["Aaaa", "Bbbb", "Cccc"]
a.each do |item|
  print item + "\n"
end
  • 結果
Aaaa
Bbbb
Cccc
  • 配列の位置も利用したい場合
  • each_with_index
a.each_with_index do |item, index|
  p [item, index]
end
  • 結果
["Aaaa", 0]
["Bbbb", 1]
["Cccc", 2]
数字のsort
  • rubyのsort関数のデフォルトは文字によるソート
b = [1,2,3,99,20.9,"a","10"]
p b                                #=>[1, 2, 3, 99, 20.9, "a", "10"]
p b.sort{|x,y|x.to_i <=> y.to_i}   #=>["a", 1, 2, 3, "10", 20.9, 99]
selectメソッド
  • 要素内から真のものだけ取得する
c = [1,2,3,4,5,6,7,8,9,10]
p c.select{|cc|cc % 2 == 0}     #=>[2, 4, 6, 8, 10]