#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 было другое поведение, основанное на символе / строке. Я не знаю, так ли это до сих пор. Одна только угроза заставляет меня немного нервничать, но на данный момент у меня нет веской технической причины. Я думаю, мысль о том, чтобы сделать символ более похожим на строку, просто заставляет меня нервничать.