Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

381
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!