★は、実現したい内容に対して対応する構文や処理を指す。
【制作物】
RGBカラーを変換するプログラム
【学習内容】
・配列
・ブロック
・範囲(Range)
・様々な繰り返し処理
・繰り返し処理ようの制御構造
【配列とは】
・複数のデータをまとめて格納するオブジェクト
・String型、Integer型など異なるデータを一緒に格納可
→[] #空の配列を作る
→[a1, a2, a3] #3つの要素が格納された配列を作る
★配列に新しい値を入れたい★
構文:配列[添字] = 新しい値
例:
a = [1,2,3] ※番号は、0,1,2の順番
a[1] = 20
a #=> [1,20,3]
★配列内の特定の位置にある要素を削除したい★
delete_atメソッド
例:
a = [1,2,3] #2番目の要素を削除する(削除した値が戻り値になる)
a.delete_at(1) #=> 2
a #=> [1,3]
※存在しない添字を指定するとnilが戻り値となる
【ブロックとは】
・メソッドの引数として渡せる処理の塊のこと
★配列の要素を最初〜最後まで順番に取り出したい★
・eachメソッド
★↑で取り出した要素をどう処理するのか?を記述したい★
・ブロック(do〜endまで)が実際の処理を行う
・ブロックの内部は、Rubyのコードを自由に記述できる
・ブロック内で設定した変数(ローカル変数)は、そのブロック内でしか定義できない
(Ref:https://qiita.com/mary_new_programmer/items/4c4353c3d1df7242f515)
例:eachメソッド
numbers.each do |n|
sum += n
end
#|n|はブロック引数で、eachメソッドから渡された配列の要素が入る
★指定した値に一致する(配列の)要素を削除したい★
・deleteメソッド
・delete_ifメソッドとすることで、ある条件のもとで削除させることも可能
【do...endと{}】
簡潔な記述方法
(before)
numbers = [1,2,3,4]
sum = 0
numbers.each do |n| sum += n end
sum
(after)
numbers = [1,2,3,4]
sum = 0
numbers.each {|n|
sum += n
}
sum
【ブロックを使う配列のメソッド】
★各要素に対してブロックを、評価した結果を新しい配列にして返したい★
・map/collectメソッド(エイリアスメソッド:collect)
★各要素に対してブロックを評価し、その戻り値が真の要素を集めた配列を返して欲しい★
・selectメソッド(エイリアスメソッド:find_all)
★ブロックの戻り値が真になった最初の要素を返して欲しい★
・findメソッド(エイリアスメソッド:detect)
★たたみ込み演算を行って欲しい★
・injectメソッド(エイリアスメソッド:reduce)
【範囲(Range)】
★値の範囲を表すオブジェクトを作成したい★
・最初の値..最後の値(最後の値を含む場合)を記述
・最初の値...最後の値(最後の値を含まない場合)を記述
→Rangeクラスのオブジェクトになる
例:
1..5
1...5
'a'..'e'
'a'...'e'
★配列や文字列の一部を取り出したい★
例:
a = [1,2,3,4,5]
a[1..3] #=>[2,3,4]
★n以上m以下(未満)の判定をしたい★
・不等号を使うケースがあるが、範囲オブジェクトを使うとラク
例:
def liquid?(temperture)
#0度以上100度未満なら液体と判定したい
(0...100).include?(temperture)
end
liquid(-1) #=>false
liquid(99) #=>true
liquid(100)#=>false
例:case文との併用
※case〜when構文:一つの値に対して複数の候補の中で一致するものを返したい
(特定のオブジェクトが持つ値がどの値に一致するのかを調べたい)
def charge(age)
case age
when 0..5
0
when 6..12
300
when 13..18
600
else 1000 #それ以外
1000
end
charge(3) #=> 0
charge(18) #=> 600
★範囲オブジェクトを配列(=別オブジェクト)に変換させたい★
・to_aメソッド
例:
numbers = (1..4).to_a
sum = 0
numbers.each { |n| sum += n }
sum #=> 10
※ただし範囲オブジェクトに対して直接eachメソッドを呼び出すことも可能
★期待する結果、テスト対象となる値や式を検証したい★
・assert_equal 期待する結果、テスト対象となる値や式