QA@IT

Hash.first が Hash を返さない理由

5871 PV

先ほどHash.firstHashではなく Arrayを返すことに気づきました。

{a: 1, b:2}.first
# => [:a, 1]

とりあえず

Hash[*{a: 1, b:2}.first]
# => {:a=>1}

でHashは作成できるのですが、何故このような言語仕様になっているかがわかりませんでした。

どういった経緯でこうなったかのご存じの方はおりますか?
理由を知っていればまた間違えて使ってしまうことも減ると思いますので。

回答

Enumerable#first ですね。

Hash#each だと、ブロックを取って、キーと値を引き渡します。ブロック引数ということで、キー・値ペアを一変数で受けると、Arrayになってしまいますね。

{a: 1, b:2}.each {|x| p x}
=>[:a, 1]
[:b, 2]

同様に、{a: 1, b:2}.to_a も、[{a: 1}, {b: 2}]でなく、[[:a,1], [:b,2]]です。

編集 履歴 (0)
  • 全体の統一感を保つためにこうなってるんですね。ありがとうございます。 -

Hash で インクルードされている Enumerable でそう定義されているからではないでしょうか。

編集 履歴 (0)
  • HashではなくEnumerableでの定義だからこうなっているんですね。ありがとうございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。