когда объект делает respond_to? :to_str
, вы ожидаете, что он действительно будет вести себя как String
. Это означает, что он должен реализовывать все методов String
, так что вы можете потенциально сломать некоторый код, полагаясь на это.
to_s
означает, что вы получаете строковое представление вашего объекта, поэтому многие объекты реализуют его, но полученная вами строка далеко не является "семантически" эквивалентной вашему объекту (an_hash. to_s далеко не Hash
). Отсутствие :symbol.to_str
отражает это: символ НЕ и НЕ ДОЛЖЕН путаться со строкой в Ruby, потому что они служат совершенно другим целям.
Вы бы не подумали о добавлении to_str
в Int, верно? И все же Int имеет много общего с символом: каждый из них уникален. Когда у вас есть символ, вы ожидаете, что он будет уникальным и неизменным .