2009-11-10 16 views
61

siempre hago esto a prueba de igualdad de cadenas en Ruby:¿La forma más concisa para probar la igualdad de cadenas (no la igualdad de objetos) para cadenas de Ruby o símbolos?

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

es que esta es la forma correcta de hacer esto sin igualdad de objetos de prueba?

Busco la manera más concisa para probar cadenas en función de su contenido.

Con la marca paréntesis y pregunta, esto parece un poco torpe.

Respuesta

10

Su ejemplo de código no se amplió en una parte de su tema, a saber, los símbolos y de manera que parte de la pregunta quedó sin respuesta.

Si tiene dos cadenas, foo y bar, y ambos pueden ser una cadena o un símbolo, puede probar la igualdad con

foo.to_s == bar.to_s 

Es un poco más eficiente para saltarse las conversiones de series de operandos con tipo conocido Así que si foo es siempre una cadena

foo == bar.to_s 

Sin embargo, el aumento de la eficiencia no es casi seguro que vale la pena exigir ningún trabajo adicional en nombre de la persona que llama.

Antes de Ruby 2.2, evite internar cadenas de entrada no controladas con fines de comparación (con cadenas o símbolos), ya que los símbolos no son basura, y puede abrirse a denegación de servicio por agotamiento de recursos. Limite el uso de símbolos a los valores que controla, es decir, literales en su código y propiedades de configuración confiables.

Rubí 2,2 introduced garbage collection of symbols.

+6

'foo.intern == bar.intern' sería mejor: la internación de una cadena es más eficiente en promedio que la creación de una cadena a partir de un símbolo. (Si una cadena dada ha sido internada previamente, simplemente devuelve el símbolo.) – Chuck

+0

Excelente, gracias por tomarse el tiempo para agregar esto. – sheldonh

+4

En realidad no creo que es una buena idea crear un símbolo de una cadena sólo para economizar un poco en algunas de las comparaciones, ya que se fuga símbolos si la cadena no coincide. Los símbolos no son basura recolectada y, por lo tanto, no deberían crearse si no tiene la intención de conservarlos, de lo contrario, cree un vector para un ataque de denegación de servicio. – Patru

Cuestiones relacionadas