配列(Array)
複数のデータをまとめて格納できるオブジェクトのこと
配列内のデータ(要素)は順番に並んでいて添字(インデックス)
を指定することでデータを取り出せる
配列の作成
空の配列を作る[]
3つの要素が格納された配列を作る
[要素1,要素2,要素3]
arr = [] => [] arr => [] a = [1, 2, 3, 'aa', [1, 2, 3]] => [1, 2, 3, "aa", [1, 2, 3]] 2.5.1 :006 > a[0] => 1 2.5.1 :007 > a[1] => 2 2.5.1 :008 > puts a 1 2 3 aa 1 2 3 => nil 小文字のwはシングルクォートとおなじで %w(a b) => ["a", "b"] 大文字のWはダブルクォートとおなじで式展開できる a = 1 => 1 b = 2 => 2 %W(あ#{a} い#{b}) => ["あ1", "い2"] シンボルに変換もできる %i[ a b c ] => [:a, :b, :c] 繰り返し処理をする時 %w[a b c].each do |abc| puts abc end a b c => ["a", "b", "c"] breakは指定したものまで繰り返す %w[a b c].each do |abc| break if abc == 'c' puts abc end a b => nil nextは指定したものをスキップする %w[a b c].each do |abc| next if abc == 'b' puts abc end a c => ["a", "b", "c"] mapを使って配列内に()を付加 %w[a b c].map { |abc| "(#{abc})" } => ["(a)", "(b)", "(c)"]
aは空か?(.empty)
a.empty? => false 2.5.1 :010 > b = [] => [] 2.5.1 :011 > b.empty? => true
変数aに’aa’はふくまれている?(.include)
2.5.1 :012 > a.include?('aa') => true 2.5.1 :013 > a.include?('b') => false
a = [[1, 2, 3], "aa", 3, 2, 1] 2.5.1 :014 > a.reverse => [[1, 2, 3], "aa", 3, 2, 1] 2.5.1 :015 > a => [1, 2, 3, "aa", [1, 2, 3]] 2.5.1 :016 > a.reverse! => [[1, 2, 3], "aa", 3, 2, 1] 2.5.1 :017 > a => [[1, 2, 3], "aa", 3, 2, 1]
配列をランダムにする(.shuffle)
2.5.1 :018 > a.shuffle => [3, 2, "aa", 1, [1, 2, 3]] (0..25).to_a => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25] 2.5.1 :026 > (0..99).to_a.shuffle! => [96, 92, 23, 49, 27, 60, 20, 72, 8, 50, 70, 64, 41, 75, 88, 26, 82, 14, 6, 78, 10, 55, 74, 48, 17, 52, 24, 16, 95, 63, 36, 19, 91, 93, 57, 85, 56, 67, 2, 15, 89, 44, 31, 43, 98, 3, 38, 28, 12, 86, 35, 65, 83, 94, 47, 0, 81, 4, 62, 77, 84, 13, 90, 33, 45, 21, 99, 39, 22, 71, 46, 61, 66, 87, 25, 30, 29, 34, 51, 73, 68, 18, 69, 37, 80, 11, 7, 9, 58, 5, 53, 42, 1, 40, 79, 59, 32, 54, 76, 97]
配列に新しく入れる(.push)(<<)
z = (0..10).to_a => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2.5.1 :028 > z << 20 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20] 2.5.1 :029 > z => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20] 2.5.1 :030 > z.push(30) => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30] 2.5.1 :031 > z => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]
配列の最後を取り出す(.pop)
2.5.1 :032 > z.pop => 30 2.5.1 :033 > z => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
最初の配列を取り出す(.shift)
z.shift => 0 z => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20] 2.5.1 :038 > z << 3 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3] 2.5.1 :039 > z << 6 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6]
重複したものがなくなり一つにまとまる(.uniq)
2.5.1 :040 > z.uniq => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20] 2.5.1 :041 > z => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6] 2.5.1 :042 > z.uniq! => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20] 2.5.1 :043 > z => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
配列の文字列を結合する(.join)並び替える(.sort)
s = ['my' 'name' 'is' 'suzutuki'] s => ["my", "name", "is", "suzutuki"] 2.5.1 :048 > s.join => "mynameissuzutuki" 2.5.1 :049 > s.join(' ') => "my name is suzutuki" 2.5.1 :050 > s.join('_') => "my_name_is_suzutuki" s.sort.reverse => ["suzutuki", "name", "my", "is"] 2.5.1 :053 > s.sort.reverse! => ["suzutuki", "name", "my", "is"] 2.5.1 :054 > s => ["my", "name", "is", "suzutuki"]
↓配列の数がわかる s.size => 4
シンボル
ソースコード上では文字列のように見えるが内部では整数として扱われる。
シンボルを使った形の方が文字列をきれいに使う場合に比べて、ハッシュのアクセスは速いとされる
オブジェクトIDを確認すると、String オブジェクト で は 同じ 文字列であっても別のオブジェクトが生成されるのに対してシンボルでは同じシンボル名であれば同一のシンボルを指している。
ハッシュとは?
キー(key)と値(Value)の組み合わせでデータを管理するオブジェクト
連想配列、ディクショナリー、マップと言う場合も
ハッシュの作成
空のハッシュを作成{}(中かっこと読む)
キーと値の組み合わせを3つ格納するハッシュを作成
{キー1 => 値1, キー2 => 値2, キー3 => 値3 }
suzutuki = {'name' => 'suzutuki', 'birthplace' => 'Gihu'} => {"name"=>"suzutuki", "birthplace"=>"Gihu"} 2.5.1 :058 > puts suzutuki['name'] suzutuki => nil 2.5.1 :059 > puts suzutuki['birthplace'] Gihu => nil 2.5.1 :060 > suzutuki['age'] = 18 => 18 2.5.1 :061 > puts suzutuki {"name"=>"suzutuki", "birthplace"=>"Gihu", "age"=>18} => nil ↓ageを20に変更したいとき suzutuki['age'] = 20 => 20 2.5.1 :063 > puts suzutuki {"name"=>"suzutuki", "birthplace"=>"Gihu", "age"=>20} => nil suzutuki.delete('age') => 20 puts suzutuki {"name"=>"suzutuki", "birthplace"=>"Gihu"} => nil
ota = {name: 'ota', birthplace: 'tokyo'} => {:name=>"ota", :birthplace=>"tokyo"} 2.5.1 :067 > puts ota[:name] ota => nil 2.5.1 :068 > ota[:age] = 20 => 20 2.5.1 :070 > ota[:age] = 21 => 21 2.5.1 :072 > puts ota {:name=>"ota", :birthplace=>"tokyo", :age=>21} => nil 2.5.1 :073 > ota.delete(:age) => 21 puts ota {:name=>"ota", :birthplace=>"tokyo"} => nil
キーの確認.keys
ota.keys => [:name, :birthplace]
値の確認.values
2.5.1 :075 > ota.values => ["ota", "tokyo"] 2.5.1 :076 > ota.has_key?(:name) => true 2.5.1 :077 > ota.has_key?(:address) => false 2.5.1 :078 > ota.size => 2
Time,Dateオブジェクト
Time.now => 2021-010-02 12:06:55 +0900 [6] pry(main)> Time.now.zone => "JST" [7] pry(main)> datetime = Time.new(2021, 10, 2, 12, 45) => 2021-01-02 12:45:00 +0900 [8] pry(main)> datetime.strftime('%Y年 %m月 %d日 %H時 %M分') => "2021年 10月 02日 12時 45分" いきなりDateクラスは使えない [9] pry(main)> Date NameError: uninitialized constant Date Did you mean? Data from (pry):12:in `__pry__' requireをすることで使えるようになる [10] pry(main)> require 'date' => true [11] pry(main)> Date => Date Date.today => #<Date: 2021-01-02 ((2459317j,0s,0n),+0s,2299161j)> [15] pry(main)> Date.new(2021, 10, 2) => #<Date: 2021-01-02 ((2459217j,0s,0n),+0s,2299161j)> [17] pry(main)> Date.new(2021, 10, 2).strftime('%Y年 %m月 %d日 %H時 %M分') => "2021年 10月 02日 00時 00分"