16
16

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 5 years have passed since last update.

Ruby 2.3のHash#digについて思ったこと

Last updated at Posted at 2015-12-14

RubyKaigiで尻の耐久試験をしてきました。
Ruby3.0は1.9以来の大変革になりそうですね。並列性を持たせるためにどういう仕組みが導入されるのか、本当に3倍速くなるのか、楽しみでなりません。

RubyMotionmrubyに関してもかなり興味深い話を聞きました。クライアントもサーバもRubyで書く、Rubyistに(だけ)優しい世界はもうそこまで来ているのかもしれません。

未来への興味も尽きないわけですが、現在の話。
Kaigiの初日に合わせてRuby 2.3.0-preview2がリリースされました。
早速ダウンロードしましたが、新機能の中でもsafe navigation operatorはうれしいですね。
それと、ArrayとHashのdigもコードの削減にはかなり効きそうです。
が、試してみて一つ地味に驚いたことが。

dig.rb
h = Hash.new(0)
h.dig(:a, :b, :c)
#=> nil

見ての通り、Hashにデフォルト値を指定していても、
Hash#digで存在しないキーを掘り当てたときの戻り値はnilです。
おそらくArray#digと動作を合わせるための仕様なんでしょうけど、
メソッドチェインする場合なんかは地味に困りそうです。
そんなときのためのsafe navigation operatorなんでしょうけどね。

ちなみに、Rubyのsafe navigation operator(&.)は
Matz曰く「ぼっち演算子」なので、書いていると寂しくなりそうです。
長いメソッドチェインだと集団ぼっちなんでしょうか。

##追記

最近、

h = Hash.new(0)
h.dig(:a, :b, :c)

はエラーになるようになりました(h[:a]の値0がdigをしらないので)。

とのこと。正式版はこの動作になると思われるので、深い階層の存在しない可能性のあるキーを掘る必要がある場合は下手にデフォルトを指定しない方が良さそうです。

16
16
8

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
16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?