2009-11-10 15 views
61

faccio sempre questo per test di uguaglianza stringa in Ruby:Modo più conciso per testare l'uguaglianza delle stringhe (non l'uguaglianza degli oggetti) per le stringhe o i simboli di Ruby?

if mystring.eql?(yourstring) 
puts "same" 
else 
puts "different" 
end 

è questo è il modo corretto di fare questo senza uguaglianza oggetto di prova?

Sto cercando il modo più conciso per testare le stringhe in base al loro contenuto.

Con parentesi e punto interrogativo, questo sembra un po 'goffo.

risposta

10

L'esempio di codice non è stato ampliato su parte del tuo argomento, ovvero simboli, e quindi la parte della domanda non ha ricevuto risposta.

Se si dispone di due stringhe, foo e bar, ed entrambi possono essere una stringa o un simbolo, è possibile verificare l'uguaglianza con

foo.to_s == bar.to_s 

E 'un po' più efficiente di saltare le conversioni di stringhe su operandi con tipo conosciuto. Quindi, se foo è sempre una stringa

foo == bar.to_s 

Ma il guadagno di efficienza non è quasi certamente la pena di chiedere alcun lavoro supplementare per conto del chiamante.

Prima di Ruby 2.2, evitare di internare stringhe di input non controllate ai fini del confronto (con stringhe o simboli), perché i simboli non sono garbage collection, e quindi è possibile aprirsi a denial of service attraverso l'esaurimento delle risorse. Limita il tuo utilizzo dei simboli ai valori che controlli, ovvero i valori letterali nel codice e le proprietà di configurazione attendibili.

Ruby 2.2 introduced garbage collection of symbols.

+6

'foo.intern == bar.intern' sarebbe meglio - internare una stringa è in media più efficiente della creazione di una stringa da un simbolo. (Se una determinata stringa è stata precedentemente internata, restituisce semplicemente il simbolo.) – Chuck

+0

Eccellente, grazie per aver dedicato del tempo per aggiungere questo. – sheldonh

+4

In realtà non penso che sia una buona idea creare un simbolo da una stringa solo per economizzare un po 'su alcuni dei confronti in quanto perderà i simboli se la stringa non corrisponde. I simboli non sono garbage collection e quindi non dovrebbero essere creati se non si intende mantenerli, altrimenti si crea un vettore per un attacco denial of service. – Patru

Problemi correlati