Почему символы не являются замороженными строками?

Я понимаю теоретическую разницу между строками и символами. Я понимаю, что символы предназначены для представления концепции, имени, идентификатора, метки или ключа, а строки представляют собой набор символов. Я понимаю, что строки изменяемы и преходящи, тогда как символы неизменны и постоянны. Мне даже нравится, как символы выглядятиначе, чем строки в моем текстовом редакторе.

Что меня беспокоит, так это то, что на практике символы настолько похожи на строки, что тот факт, что они не реализованыкак строки, вызывает много головной боли. Они даже не поддерживают утиный ввод или неявное принуждение, в отличие от другой известной пары «то же самое, но другое», Float и Fixnum.

Самая большая проблема, конечно же, заключается в том, что хэши, поступающие в Ruby из других мест, таких как JSON и HTTP CGI, используют строковые ключи, а не символьные ключи, поэтому программам Ruby приходится из кожи вон лезть, чтобы либо преобразовать их заранее, либо в время поиска. Само существование HashWithIn DifferentAccessи его безудержное использование в 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

Все, что нужно, чтобы следующее поколение рубистов стало менее запутанным, это:

class Symbol < String
  def initialize *args
    super
    self.freeze
  end

(и множество других хакерских приемов на уровне библиотеки, но все же не слишком сложных)

См. также:

Обновление: я думаю, что Матц очень хорошо обосновывает class Symbol здесь: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby /ruby-core/9192(спасибо Азоло за то, что раскопал это, а также возможное опровержение Матца).

23
задан AlexChaffee 9 October 2017 в 13:04
поделиться