LoginSignup
3
1

More than 1 year has passed since last update.

[Ruby] ハッシュでぼっち演算子が使いたい

Last updated at Posted at 2022-12-04

(2022.12.6追記)

記事本体より @jnchito さんのコメントの方が参考になりますので、そちらもご覧ください。

(2022.12.6追記終わり)

変数にオブジェクトまたは nil が入ってる場合、ぼっち演算子(Safe Navigation Operator)を使うと安全にメソッドを呼び出せます。

irb(main):017:0> str = "abc"
irb(main):018:0> str.size
=> 3
irb(main):019:0> str = nil
irb(main):020:0> str.size
Traceback (most recent call last):
        4: from /usr/bin/irb:23:in `<main>'
        3: from /usr/bin/irb:23:in `load'
        2: from /usr/lib/ruby/gems/2.7.0/gems/irb-1.2.1/exe/irb:11:in `<top (required)>'
        1: from (irb):20
NoMethodError (undefined method `size' for nil:NilClass)
irb(main):021:0> str&.size
=> nil

こんな感じでハッシュに対して nil 安全にアクセス出来ないか考えてみました。

irb(main):023:0> hash = {a: 1, b: 2}
irb(main):024:0> hash[:a]
=> 1
irb(main):025:0> hash = nil
irb(main):026:0> hash[:a]
Traceback (most recent call last):
        4: from /usr/bin/irb:23:in `<main>'
        3: from /usr/bin/irb:23:in `load'
        2: from /usr/lib/ruby/gems/2.7.0/gems/irb-1.2.1/exe/irb:11:in `<top (required)>'
        1: from (irb):26
NoMethodError (undefined method `[]' for nil:NilClass)

nil は Ruby では false 扱いですから三項演算子を使えばいけます。

irb(main):027:0> hash ? hash[:a] : nil
=> nil

|| で空ハッシュを返してやってもいけます。

irb(main):028:0> (hash || {})[:a]
=> nil

https://qiita.com/YumaInaura/items/eb45d79319aeb6c19d46 によると、ぼっち演算子で [] メソッドを呼んでやればうまくいくと。説明されたら理屈は分かりますが、いきなりこのコード見せられたら私は読める自信がありません。

irb(main):029:0> hash&.[](:a)
=> nil

dig 使えばうまくいきました。個人的にはこれが一番読みやすいですかねぇ。

irb(main):030:0> hash&.dig(:a)
=> nil
3
1
4

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