2020/02/27
enumのネガティブバージョンを定義してみた
- 投稿者
- willian
こんにちは!日本語が少しできるブラジル人です!
早速ですが、複数条件を書くときにenumに対して否定演算子を使った事ありますか?
ちなみに僕は複数条件を書くときに否定演算子を使用するのはあまり好きじゃないです。。
こんなunless文をみたときには、もうブラジルに帰って農家に転職したくなってしまいます。。
unless !user.present? && !user.done? && !user.is_pokemon?
# some code
end
なので、今回は少しでも理解がしやすいように、enumのネガティブバージョンを定義してみようと思いますー!
実装
早速ネガティブバージョンのメソッドを定義してみる
class User
enum status: {
pending: 0,
done: 1,
canceled: 2
}
def not_pending?
!pending?
end
def not_done?
!done?
end
def not_canceled?
!canceled?
end
end
> user = User.new(status: :pending)
> user.present? && user.not_done?
> true
↑の方法だと、今後ステータスが増えたときに毎回ネガティブバージョンを定義するのに手間がかかるから、define_methodでenumのネガティブバージョンを定義してUserクラス内をスッキリさせる
class User
enum status: {
pending: 0,
done: 1,
canceled: 2
}
self.statuses.each_key do |enum_name|
define_method("not_#{enum_name}?") do
!send("#{enum_name}?")
end
end
end
> user = User.new(status: :pending)
> user.present? && user.not_done?
> true
完了!!
これで否定演算子まみれの条件を見なくて済みますね!やったね!!