他の言語やっていた人がRubyやって、なるほどこう書くのか、と思ったものを幾つか。
presence
a = b.present? ? b : nil
a = b.presence
上下とも同じ意味だけど、三項演算子よりも、presenceの方がRubyライク。
※ただしpresenceはRailsのメソッドなので注意
ここで、nilではなく任意の値を入れるならば「||」でいれる。
a = b.presence || 'hoge'
ループ
[*1..10].each do |index|
end
for(int i = 1; i<11 ;i++){
}
ずっとC#だったので、ループというとfor文と思ってしまうけど、Rubyは配列を回すイメージ。
そしてよくある、「この配列の中に'A'という値が含まれるか」チェックは、C#だとループ回してif文かませるパターンですが、Rubyならany?でいける。
[*1..10].any?(4)
で、業務で使うとすると、こういう風にブロックを記述するパターンが汎用的。
[*1..10].any? {|index| index.modulo(3) == 0 }
個人的な教訓として、配列を回したくなったら、Rubyにはなにか便利なのがあるから調べたほうが良い。
Enumerable#any?とArray#include?
コメントで教えていただいたので追記です。
[*1..10].any?
と例に出しましたが、配列で「〇を含むか?」はinclude?
があり、こちらの方が高速です。
any?の方が高速になるのは、any?にモデルなど、値以外を渡す場合になります。
※以下、教えていただいたscivola様のコードを転記いたします
# 数字を含む文字列はあるか
["hoge", "AE35", ""].any?(/\d/)
# 1 以上 10 未満の数はあるか
[0.2, -8, 9.80665].any?(1...10)
# 整数オブジェクトはあるか
[0.2, 7, 2/3r].any?(Integer)
Rubyでの記述は、同じことを実現するのに複数の種類のメソッドがありますが、「今回はどちらが高速か?」という観点も大切にします。
自分への戒めも含め、ここに記述します。