文字列と記号の理論的な違いを理解しています。シンボルは概念、名前、識別子、ラベル、キーを表すものであり、文字列は文字の袋であることを理解しています。文字列は可変で一時的であり、シンボルは不変で永続的であることを理解しています。テキスト エディタでシンボルが文字列と異なって見える点も気に入っています。
私が気になるのは、実際に言えば、シンボルは文字列に非常に似ているため、文字列として実装されていないという事実が多くの頭痛の種を引き起こしているということです。他の有名な「同じだが異なる」対である Float と Fixnum とは異なり、ダックタイピングや暗黙の強制さえサポートしていません。
もちろん、最大の問題は、JSON や HTTP CGI などの他の場所から Ruby に取り込まれるハッシュが、シンボル キーではなく文字列キーを使用することです。そのため、Ruby プログラムはこれらを事前に変換するか、ルックアップ時に変換する必要があります。が存在するだけでHashWithIndifferentAccess
、Rails やその他のフレームワークで広く使用されていることは、ここに問題があることを示しています。
シンボルが凍結された文字列であってはならない実際的な理由を誰か教えてもらえますか? 「それが常に行われてきた方法だから」(歴史的)または「シンボルは文字列ではないため」(質問を懇願する)以外。
次の驚くべき動作を考えてみてください。
:apple == "apple" #=> false, should be true
:apple.hash == "apple".hash #=> false, should be true
{apples: 10}["apples"] #=> nil, should be 10
{"apples" => 10}[:apples] #=> nil, should be 10
:apple.object_id == "apple".object_id #=> false, but that's actually fine
次世代の Rubyist の混乱を軽減するために必要なのは、次のことだけです。
class Symbol < String
def initialize *args
super
self.freeze
end
(そして他の多くのライブラリレベルのハッキングですが、それでもそれほど複雑ではありません)
以下も参照してください。
- http://onestepback.org/index.cgi/Tech/Ruby/SymbolsAreNotImmutableStrings.red
- http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol
- ハッシュ文字列ではなくハッシュ記号を使用するとコードが壊れるのはなぜですか?
- Rubyでシンボルをハッシュキーとして使用するのはなぜですか?
- シンボルとは何ですか?
- Ruby シンボルとハッシュ内の文字列
- Ruby で記号のコツがつかめない
- http://blog.arkency.com/could-we-drop-symbols-from-ruby/
- 文字列は変更可能でインターンされていないため、Ruby シンボルは存在しますか?
class Symbol < String
更新: Matz はここで非常によく主張していると思います: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/9192 (これを掘り下げてくれた Azolo に感謝します。また、マッツの最終的な撤回)。