質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2938閲覧

Ruby上でHashを扱うときにStringとSymbolどちらをKeyにするか

nasutaro211

総合スコア21

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/08/07 23:02

Rubyでハッシュを扱うときにStringをkeyに設定する利点は何かありますか?

ハッシュは内部的にはIntとして扱われているらしいので、実行速度の面でも安全性(打ち間違いによるエラー防止)のためにも多くの場合SymbolをKeyに使ったほうがいい気がしています。

素人考えですのでどなたかStringをKeyに設定するいい場面があったら教えてください。
また、もし特に利点がないのであれば、HashのKeyを全てSymbolにしてしまっても問題がないかが知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

基本的にはSymbolを用います

Stringを用いる場面としては、なんらかの入力の結果キー含めて作られる・使われるHashの場合
わざわざ入力された文字列をSymbolに変換するのも面倒くさいのでStringをキーにする場面があります。

その他
  • Ruby2.2以降文字列キーは自動的にfreezeされる事でSymbolを用いた場合との速度差はだいぶ縮まっています。
  • キーをStringにしようがSymbolにしようが結果は同じですので安全性に差はありません。
  • Symbolにした方がkey => val記法ではなくkey: val記法を使えるのでちょっと楽
  • Railsでは多くのハッシュがstringify_keysによって文字列キー/シンボルキー両対応に変換されているが

個人的には初心者ほど混乱する酷いお節介だと思ってます。

投稿2018/08/07 23:37

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Ruby 2.2未満では、Symbolがガベージコレクトされないため、むやみやたらにSymbolを作っていくとシンボルテーブルを食い尽くす、という問題があったのですが、Ruby 2.2で解消しています。

あと、(Railsあるいはactivesupportを前提とできる環境であれば)どっちをキーにしても出力できる、HashWithIndifferentAccessという選択肢もあります(Qiita)。これはRuby 2.2より前からあるので、内部的には文字列で管理しています。

ちなみに、「打ち間違いによるエラー防止」という意味では、何をキーにしても打ち間違えればnilが返るのは同じなので、そこは差になりません。

投稿2018/08/07 23:17

maisumakun

総合スコア145930

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasutaro211

2018/08/07 23:27

ありがとうございます! ひとまずそれであればキーを全部Symbolで書いても大丈夫そうですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問