Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

379
Vistas
¿Qué significa el "-" delante de un símbolo de rubí?

Cuando eché un vistazo a la fuente de ActiveRecord hoy, me topé con estas líneas

 name = -name.to_s

https://github.com/rails/rails/blob/2459c20afb508c987347f52148210d874a9af4fa/activerecord/lib/active_record/reflection.rb#L24

y

 ar.aggregate_reflections = ar.aggregate_reflections.merge(-name.to_s => reflection)

https://github.com/rails/rails/blob/2459c20afb508c987347f52148210d874a9af4fa/activerecord/lib/active_record/reflection.rb#L29

¿Para qué sirve el operador - en el name del símbolo?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Eso es String#-@ :

Devuelve una copia congelada, posiblemente preexistente, de la cadena.

Ejemplo:

 a = "foo" b = "foo" a.object_id #=> 6980 b.object_id #=> 7000

contra:

 a = -"foo" b = -"foo" a.object_id #=> 6980 b.object_id #=> 6980
over 4 years ago · Santiago Trujillo Denunciar

0

¿Para qué sirve el operador - en el name del 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_string

Devuelve 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#+@ .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda