Cuando eché un vistazo a la fuente de ActiveRecord hoy, me topé con estas líneas
name = -name.to_sy
ar.aggregate_reflections = ar.aggregate_reflections.merge(-name.to_s => reflection) ¿Para qué sirve el operador - en el name del símbolo?
¿Para qué sirve el operador
-en elnamedel símbolo?
Tiene sus reglas de precedencia incorrectas: el operador de envío de mensajes binarios ( . ) tiene una precedencia más alta que todo lo demás, lo que significa que - no se aplica al name de la expresión sino a la expresión name.to_s .
En otras palabras, parece pensar que esta expresión se analiza así:
(-name).to_s # which is the same as name.-@().to_s()pero en realidad se analiza como
-(name.to_s) # which is the same as name.to_s().-@() Ahora, no sabemos qué name es, pero a menos que alguien esté jugando seriamente contigo, #to_s debería devolver un String . En otras palabras, el operador no se aplica a un Symbol , como pensabas.
Por lo tanto, sabemos que estamos enviando el mensaje -@ a un String y, por lo tanto, podemos buscar qué hace String#-@ en la documentación:
-string→frozen_stringDevuelve una copia congelada, posiblemente preexistente, de la cadena.
La cadena devuelta se deduplicará siempre que no tenga ninguna variable de instancia configurada.
String creados dinámicamente no se congelan de forma predeterminada. Solo los literales de String estáticos lo son, según la configuración del comentario mágico # frozen_string_literals: true . String#-@ se agregó como un alias para String#freeze para permitirle congelar y deduplicar una String con el menor ruido sintáctico posible.
La operación opuesta también está disponible como String#+@ .