よく忘れちゃうのでメモ。
配列関係
インスタンス化
list = [1, 2, 3] # 正統派プリミティブ表現
list = %w(吾輩は猫である 名前は萬田太郎) # 文字列。%W()だと"#{変数}"みたいなのも展開してくれる
list = Array.new(5) # 五枠の配列になる。中身はnil。
# 初期値を渡すときは第二引数に指定できるが、全要素が同じオブジェクトを参照するようになる。
# 細かく指定したいならブロックを渡そう。
取得・検索
list[0] # 0番目
list[2, 3] # 2個目から3つ取り出す
list[2..3] # 2個目から3つ目まで
list[..3] # 最初から3つ目まで。負の数を指定したら最後から数えて、になる。
list.first # 0番目を取得。引数を渡すと最初からn個
list.last # 最後を取得。引数で最後からn個。
list.vatues_at(1, 3, 5) # 1つ目、3つ目、5つ目。
list.fetch(2, "ねえよ") # 2つ目、なかったら"ねえよ"が返る。
list.sample(2) # 無作為に2つ選んで返す。
list.find(ifnone) { |item| item.odd? } # 条件に一致するものを探して見つかった最初のものを返す。
# ifnoneはcall()を持つオブジェクト。渡されたとき、条件に一致するものが一つもない場合にcallback
list.find_all { |item| item.end_with?(".com") } # 条件に一致するものすべてを返す。さもなくば空配列。
list.reject { |item| item.empty? } # find_all()の逆。不一致なもののみ取り出す。
list.grep(/0-9+/)
list.index(val) # 要素中からvalを探してそのidx番号を返す。さもなくばnil
list.index { |v| v.lenght < 2} # ブロックもあり。rindex()では後ろから検索できる。
list.compact # nilを消したものを返す。
置換・削除・LIFO/FIFO
list[1..3] = ["犬", "猿", "雉"] # 範囲に詰め込む。過不足が出たら無理やりぶち込む。
list.insert(2, "わんこ") # 2つ目に"わんこ"を挿入。過不足が出たら無理やりぶち込む。
list.fill("教育", range) # 配列を"教育"で埋める。第二引数にはrangeを与えられる。
list.clear # 配列を空に
list.delete("わんこ") # 配列から"わんこ"を除外。
list.delete_at(2) # 2つめを削除
list.keep_if { |elem| elem.length > 3} # 三文字未満を消去
list.push(2) # 後ろに2を積む。
list.pop(3) # 後ろから3つ取り出す。
list.shift(2) # 前から2つ取り出す。
list.unshift(2) # 前に2を積む。
走査・反復処理
自白
実はもともと書きたかったのはここだけだったりする。その他は義務感。list.each do |item|
item.upcase if item.ascii_only?
end
# JSのforEachと一緒。
# 因むとString#upcaseは大文字化、String#ascii_only?は文字列がascii文字のみか判定。
# Rubyではif文を後置できる。
list.each_with_index do |val, idx|
puts "#{idx}:#{val}"
end
# index,valueの組を受け取れる。callbackの引数の順番がval, idxと直感的でないので注意。
list.each_index { |idx| statement }
list.reverse_each { |item| statement}
# 名前の通り。{}はdo...endの省略。命令が一行で済むときはこっちの方がいいんじゃないかな。
list.map.with_index(1) { |user, idx| statement }
# 疑似的にmap_with_index()を実現できる。
list.each_cons(3) { |ary| statement }
# [1,2,3], [2,3,4], [3,4,5]のように配列を重複ありで3個ずつ切り出してブロックに渡す。
list.each_slice(2) { |items| statement } # 二つずつ配列に切り出しつつ走査。要素数に余剰が出ようとも続行する。
list.cycle(3) { |v| statement } # 配列を三週する。引数を与えないと無限に回しだすので注意。
要素の勘定
list.length # 要素数。
list.empty? # 配列が空か否か
list.count("犬") # list内にいくつ"犬"があるか。
list.tally # 要素ごとに分別して「要素:個数」の形式でハッシュ(連想配列)を返す。