最近は、コードを書いていて
短く書くかつ、わかりやすくかけるように意識しています
・コードレビューで指摘される
・普段からリファクタリングを意識して書くのでは大違いだと思うから
ということで、記法をいくつかみてまとめてみます
繰り返し使う文字列をlocaleに定義する
コードをDRYにする
時刻のフォーマット等もlocaleを使い、strftimeは基本使わない。
localeとは…
Railsガイド
住所、会社名、時間をフォーマットする時の形式、
今日の日付を出力する時の形式などを管理する。
使い方
これは、業務でも使っている。何度も使う文言とかをまとめている
テンプレのようなもの
埋め込みRuby
文字の中にRubyの式を埋め込む
リファクタ前
name = '太郎'
puts "こんにちは、 " + name + "!"
# => "こんにちは、太郎さん"
リファクタ後
name = '太郎'
puts "こんにちは、#{name}さん"
# => "こんにちは、太郎さん"
シングルクォーテーション( '' )だと、
式展開されないので注意する
三項演算子
リファクタ前
 def click_button
    if controller.action_name == 'new'
      puts "New"
    else
      puts "Nothing"
    end
  end
リファクタ後
 def click_button
  controller.action_name == 'new' ? puts "New" : puts "Nothing"
end
複雑なif文を書き換えるのには、向いていないので
なるべくシンプルな if else文で使うとよさそう
三項演算子をネストさせたりすると、かえって
可読性が悪くなる
後置if
リファクタ前
 def walk
    if user.people?
      puts '歩きます'
    end
 end
リファクタ後
 def walk
    puts '歩きます' if user.people?
 end
こちらも、多用するのではなく
こちらの記事を見るのがよさそう
ぼっち演算子
 def find_currency(country)
   currencies = { japan: 'yen', us: 'dollar' }
   currencies[country]
 end
 def show_currency(country)
   currency = find_currency(country)
   if currency
     currency.upcase
   end
 end
 show_currency(:japan) => "YEN"
 show_currency(:brazil) => nil
さらにこう書ける
 def show_currency(country)
   #条件分岐内で直接変数に代入する(値が取得できれば真、できなければ偽)
   if currency = find_currency(country)
     currency.upcase
   end
 end
Rubyでは、変数への代入自体が戻り値を持つため、if文の中で
直接、変数に代入することも可能。
しかし、これだと「=」と「==」を書き間違えたのではと勘違いされる可能性もある。
nilかもしれないオブジェクトに対して、安全にメソッドを呼び出したい場合には
ぼっち演算子を使うことができる
メソッドを呼び出したオブジェクトがnilではない場合→その結果
メソッドを呼び出したオブジェクトがnilだった場合→nil
を、それぞれ返す
リファクタ後
  def find_currency(country)
   currencies = { japan: 'yen', us: 'dollar' }
   currencies[country]
 end
 def show_currency(country)
   currency = find_currency(country)
   currency&.upcase
 end
||= (nilガード)
nilが入らないようにするもの
変数に値を入れるときに、変数がnilかfalseのときのみ値を入れることができる
pry(main)> user = nil
=> nil
pry(main)> user ||= '太郎'
=> "OK"
pry(main)> user
=> '太郎'
既に値が入っている場合は値の代入は行われない
pry(main)> user = '次郎'
=> '次郎'
pry(main)> user ||= '三郎'
=> '次郎'
引数
メソッドにわたす引数の種類ですが、割とたくさんあるので
まとめます
デフォルト引数
引数にデフォルト値を入れておいて、引数がなければデフォルト値を使用する
def putsHello(msg="No msg", name="No name")
  puts(msg + "," + name + "¥n")
end
putsHello("Hello", "Yamada") #=> 'Hello, Yamada'
putsHello("Hello") #=> 'Hello, No name'
putsHello() #=> 'No msg, No name'
キーワード引数
・ハッシュを作成したときのようにシンボル: 値で指定する
・デフォルト値の役割も果たす
・呼び出す際に、順番も自由に入れ替えることができる
def buy_burger(menu, drink: true, potato: true)
  if drink && potato
    puts "#{menu}バーガーセットとドリンクとポテトを頼みました"
  elsif drink 
    puts "#{menu}バーガーセットとドリンクを頼みました"
  elsif potato
    puts "#{menu}バーガーセットとポテトを頼みました"
  else
    puts"#{menu}バーガーセットを頼みました"
  end
end
buy_burger("cheese") #=> "cheeseバーガーセットとドリンクとポテトを頼みました"
buy_burger("cheese", drink: false, potato: true) #=> "cheeseバーガーセットとポテトを頼みました"
buy_burger("fish", potato: false, drink: false) #=> "fishバーガーセットを頼みました"
可変長引数
・引数を配列として受け取ることができる
・引数名に*をつける
def order(*food)
  puts "#{food.join('と')},お願いします!"
end
order('ハンバーガー') #ハンバーガー,お願いします!
order('ハンバーガー','ポテト') #ハンバーガーとポテト,お願いします!
order('ハンバーガー','ポテト','コーラ') #ハンバーガーとポテトとコーラ,お願いします!
参考記事
チェリー本
https://qiita.com/jnchito/items/dedb3b889ab226933ccf
https://qiita.com/d0ne1s/items/fabbc0df7c273cf04fc3
三項演算子
三項演算子
ぼっち演算子