1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby小ネタ

Last updated at Posted at 2019-11-20

他の言語やっていた人がRubyやって、なるほどこう書くのか、と思ったものを幾つか。

presence

a = b.present? ? b : nil
a = b.presence

上下とも同じ意味だけど、三項演算子よりも、presenceの方がRubyライク。
※ただしpresenceはRailsのメソッドなので注意
ここで、nilではなく任意の値を入れるならば「||」でいれる。

a = b.presence || 'hoge'

ループ

Rubyの場合
[*1..10].each do |index|
end
C#の場合
for(int i = 1; i<11 ;i++){
}

ずっとC#だったので、ループというとfor文と思ってしまうけど、Rubyは配列を回すイメージ。
そしてよくある、「この配列の中に'A'という値が含まれるか」チェックは、C#だとループ回してif文かませるパターンですが、Rubyならany?でいける。

配列に値が含まれるか?
[*1..10].any?(4)

で、業務で使うとすると、こういう風にブロックを記述するパターンが汎用的。

配列に3で割り切れる値が含まれるか?
[*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での記述は、同じことを実現するのに複数の種類のメソッドがありますが、「今回はどちらが高速か?」という観点も大切にします。
自分への戒めも含め、ここに記述します。

1
0
2

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?