Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

397
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda