Каковы недостатки добавления метода to_str к Symbol?

#ruby-on-rails #ruby #symbols

#ruby-on-rails #ruby #символы

Вопрос:

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

Итак, мой вопрос в том, почему я не должен добавлять метод to_str в symbol?

Это кажется разумным, поскольку допускает неявное преобразование между символом и строкой. Итак, я могу делать подобные вещи, не беспокоясь о вызове:symbol.to_s:

 File.join(:something, "something_else") # => "something/something_else"
  

Отрицательный параметр такой же, как и положительный, он неявно преобразует символы в строки, что может быть ДЕЙСТВИТЕЛЬНО запутанным, если это вызывает неясную ошибку, но, учитывая, как обычно используются символы, я не уверен, что это обоснованная проблема.

Есть мысли?

Ответ №1:

когда объект делает это respond_to? :to_str , вы ожидаете, что он действительно будет действовать как String . Это означает, что он должен реализовывать все методы String , поэтому вы потенциально можете сломать некоторый код, полагающийся на это.

to_s означает, что вы получаете строковое представление вашего объекта, вот почему так много объектов реализуют его — но получаемая вами строка далека от того, чтобы быть «семантически» эквивалентной вашему объекту ( an_hash.to_s далек от того, чтобы быть Hash ). :symbol.to_str отсутствие отражает это: символ НЕ является и НЕ ДОЛЖЕН путаться со строкой в Ruby, потому что они служат совершенно разным целям.

Вы бы не подумали о добавлении to_str к Int, верно? Тем не менее, Int имеет много общего с symbol : каждый из них уникален. Когда у вас есть символ, вы ожидаете, что он также будет уникальным и неизменяемым.

Комментарии:

1. Потрясающий ответ. Вы случайно не знаете о каких-либо документах ruby, в которых говорится об этом? Я хотел бы прочитать о том, как to_str используется в других частях языка.

2. извините, но у меня нет конкретного источника по этому вопросу.

Ответ №2:

Вам не обязательно неявно преобразовывать его, верно? Потому что выполнение чего-то подобного автоматически приведет к преобразованию его в строку.

 "#{:something}/something_else"  # "something/something_else"
  

Комментарии:

1. Верно, в чем преимущество добавления метода. Я думаю, что я пытаюсь выяснить, есть ли у кого-нибудь веская причина не делать этого (например, это вызывает какую-то сумасшедшую ошибку в rails)

Ответ №3:

Негатив — это то, что вы говорите — в какой-то момент, во всяком случае, у некоторых базовых Ruby было другое поведение, основанное на символе / строке. Я не знаю, так ли это до сих пор. Одна только угроза заставляет меня немного нервничать, но на данный момент у меня нет веской технической причины. Я думаю, мысль о том, чтобы сделать символ более похожим на строку, просто заставляет меня нервничать.