QA@IT
«回答へ戻る

回答を投稿

Ruby 1.9.xでとても書きやすい記法が導入されたりすることもあり、多くの場合はSymbolを使っていいんじゃないでしょうか。

一般的かどうかについて、私感ではRailsが盛り上がってきた2006年ごろ以降に作られたライブラリは、Symbolをよく使っているような気がします。before Railsだと半々くらいでしょうか。

また、RailsというかActiveSupportではHashWithIndifferentAccessという、文字列でもシンボルでもアクセス可能なHashのサブクラスが多用されています。もし「これから」「自分が」「ActiveSupport前提でのライブラリ」を作るのであれば、こちらを使うのがユーザのために一番良さそうです。なお、https://github.com/intridea/hashie など、おなじような「ちょっと便利なHash」は他にも幾つかあります。

蛇足ですが、明確な注意点としては「外部からの入力のパース結果」をSymbolをキーとしたHashで持つとヤバイことになる可能性が上がります。SymbolにしてしまうとGCされないので,
適当なキーをもつ入力を繰り返すとメモリを浪費させることができそうです。
このあたりを考慮したのか、前述のHashWithIndifferentAccessのキーはStringにしており、hash[:foo]などで問い合わせる際にStringあわせて扱っているようですね。

Ruby 1.9.xでとても書きやすい記法が導入されたりすることもあり、多くの場合はSymbolを使っていいんじゃないでしょうか。

一般的かどうかについて、私感ではRailsが盛り上がってきた2006年ごろ以降に作られたライブラリは、Symbolをよく使っているような気がします。before Railsだと半々くらいでしょうか。

また、RailsというかActiveSupportでは`HashWithIndifferentAccess`という、文字列でもシンボルでもアクセス可能な`Hash`のサブクラスが多用されています。もし「これから」「自分が」「ActiveSupport前提でのライブラリ」を作るのであれば、こちらを使うのがユーザのために一番良さそうです。なお、https://github.com/intridea/hashie など、おなじような「ちょっと便利なHash」は他にも幾つかあります。

蛇足ですが、明確な注意点としては「外部からの入力のパース結果」をSymbolをキーとしたHashで持つとヤバイことになる可能性が上がります。SymbolにしてしまうとGCされないので,
適当なキーをもつ入力を繰り返すとメモリを浪費させることができそうです。
このあたりを考慮したのか、前述の`HashWithIndifferentAccess`のキーはStringにしており、`hash[:foo]`などで問い合わせる際にStringあわせて扱っているようですね。