LoginSignup
0
0

More than 3 years have passed since last update.

チェリー本を読んだまとめ(一部)

Last updated at Posted at 2019-12-08

チェリー本(プロを目指す人のための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のフォローいただけると励みになります!
お気軽にどうぞ〜

お疲れ様でした!!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0