2009-03-18 9 views

risposta

7

Visto che i simboli vengono quasi sempre creati tramite letterali, non c'è molto potenziale per un'esplosione di memoria qui. Il loro comportamento è praticamente richiesto dal loro utilizzo: ogni volta che fai riferimento a un simbolo, è lo stesso.

Analogamente, le stringhe devono essere univoche in Ruby. Ciò è dovuto al modo in cui vengono utilizzati: elaborazione del testo, ecc.

Decidere quale utilizzare in base alla semantica, non ottimizzarlo prematuramente.

8

Se si fa riferimento allo stesso simbolo nel vostro ciclo, allora non deve ricreare che ogni oggetto cioè

while i < 10000 
    i += 1 
    :im_using_this_symbol_here 
end 

Ora, se si utilizza una stringa lì, invece, la stringa verrà ricreato 10K volte . In generale, usa i simboli nei casi in cui quasi tratti il ​​letterale come una costante o una chiave. Un ottimo esempio per me sarebbe

link_to "News", :action => 'news' 

invece di

link_to "News", "action" => 'news' 

azione viene riutilizzato più e più volte all'interno dell'applicazione.

+11

Posso aggiungere una regola empirica: mai e poi mai convertire le stringhe fornite dall'utente in Simboli. Ciò aprirebbe la possibilità di un attacco DOS. – Arsen7

6

Se si utilizza Ruby 2.2.0 o versione successiva, in genere dovrebbe essere opportuno creare dinamicamente molti simboli, poiché verranno raccolti in base allo standard Ruby 2.2.0-preview1 announcement, con un collegamento a more details about the new symbol GC. Tuttavia, se si passano i simboli dinamici a un tipo di codice che lo converte in un ID (un concetto di implementazione di Ruby interno utilizzato nel codice sorgente C), in tal caso verrà bloccato e non verrà mai raccolta la garbage collection. Non sono sicuro di quanto accade comunemente.

Al momento di decidere se utilizzare simboli o stringhe si dovrebbe prendere in considerazione:

  • simboli non possono essere cambiati dopo la loro creazione.
  • I simboli non hanno molti metodi che hanno le stringhe, come
  • I simboli possono essere confrontati molto efficientemente l'uno con l'altro per l'uguaglianza.
  • I simboli devono rappresentare il nome di qualcosa in base allo Symbol docs. Non li userei per archiviare tutto ciò che non può essere considerato un nome.
Problemi correlati