チェリー本(プロを目指す人のためのRuby入門)を改めて読んだ際の気づきや発見の一部まとめです。
ブロック引数について
menus = [
["ハム", 100],
["パスタ", 200],
["ピザ", 300]
]
menus.each do |menu,price|
puts "#{menu} #{price}円"
end
//下記のように書ける
menus.each do |menu,price|
puts "#{menu} #{price}円"
end
//each_with_indexも
menus.each_with_index do |menu,i|
puts "#{i}番 #{menu[0]} #{menu[1]}円"
end
//下記のように書ける
menus.each_with_index do |(menu,price),i|
puts "#{i}番 #{menu} #{price}円"
end
ブロックローカル関数
//「; sum」でブロック内でのみ有効なローカル変数を定義できる
menus.each do |menu,price; sum|
sum = 0
puts "#{menu} #{price}円"
sum += price
puts sum
end
ブロックを渡すと、ブロックの戻り値が要素が見つからないときの戻り値になる
menus.delete(100)
→nil
menus.delete(100) {'not_found'}
→not_found
Arrayクラス
Enumerableモジュール
while文
//条件が偽のため実行されない
while false
puts "NG"
end
//最低1回は実行される
begin
puts "OK"
end while false
breakの戻り値
i = rand(3)
ans =
loop do
break 0 if i == 0
break 1 if i == 1
break 2 if i == 2
end
puts ans // 0〜2のランダムな数字
ループからの脱出
catch タグ do
throw タグ
end
redo
//処理を繰り返す
menus = ["ハム", "パスタ", "ピザ"]
count = 0
menus.each do |menu|
puts "それは和食ですか?(#{menu})"
ans = "違います"
puts ans
count += 1
redo if ans != "そうです" && count < 2
count = 0
end
ハッシュの展開
menus = {
ハム: 100,
パスタ: 200,
ピザ: 300
}
new_menus = {コーヒー: 100, **menus} //または{コーヒー: 100}.merge(menus)でも同じ
p new_menus //{:コーヒー=>100, :ハム=>100, :パスタ=>200, :ピザ=>300}
**引数
def menu_output(menu, **others)
puts others
end
menu_output('パスタ', dessert:'ケーキ') //{:dessert=>"ケーキ"}
ハッシュの初期値設定
h = Hash.new{ 'def' } //Hash.new('def')としてしまうと同一オブジェクトとなってしまうので注意
a = h[:hoge] //"def"
b = h[:fuge] //"def"
h // {}
h = Hash.new{ |h, k| h[k] = 'def' }
a = h[:hoge] //"def"
b = h[:fuge] //"def"
h // {:hoge=>"def, :fuge=>"def}
シンボルの式展開
menus = {
pizza: 300
}
menu = 'pizza'
p menus[:"#{menu}"] // 300
文字列からシンボルへの変換
p 'abc'.to_sym // :abc
||=を使った自己代入
count ||= 0 //countがnilまたはflaseであれば0を代入する。それ以外はcountをそのまま使用する
!!を使った型変換
!!find_pizza //先頭に「!!」を付与して、trueかfalseに変換する
//上記のようにメソッドの返り値で存在判定できる。falseとnilはfalse、それ以外はtrueとなる
アクセサメソッド
//読み書き
attr_accessor :name
//読み取り専用
attr_reader :name
//書き込み専用
attr_writer :name
メソッドの存在確認
name = "yamada"
name.respond_to?(:upcase) //true upcaseはStringクラス
name.respond_to?(:join) //false joinはArrayクラス
クラスの親クラスを配列にして返すancestorsメソッド
Array.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
メソッドの定義場所を確認
//rails console
name = "yamada"
=> "yamada"
name.method(:present?).source_location
=> ["/usr/local/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/object/blank.rb", 26]
以上です。
いいねやQiitaやTwitterのフォローいただけると励みになります!
お気軽にどうぞ〜
お疲れ様でした!!!