¿Cuál es la forma canónica de recortar una cadena en Ruby sin crear una nueva cadena?
Esto es lo que tengo ahora, que parece demasiado detallado para el trabajo que está haciendo.
@title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?
Supongamos que los tokens son una matriz obtenida al dividir una línea CSV. ¡Ahora funciona como tira! ¡muerde! et. todos devuelven nulo si la cadena no fue modificada
"abc".strip! # => nil
" abc ".strip! # => "abc"
¿Cuál es la forma en que Ruby dice recortarlo si contiene espacios iniciales o finales adicionales sin crear copias?
Se pone más feo si quiero hacerlotokens[Title].chomp!.strip!
Supongo que lo que quieres es:
@title = tokens[Title]
@title.strip!
El #strip!
método regresará nil
si no eliminó nada, y la variable misma si fue eliminada.
Según los estándares de Ruby, un método con el sufijo de un signo de exclamación cambia la variable en su lugar.
Actualización: este es el resultado irb
para demostrar:
>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"
Por cierto, ahora Ruby ya admite simplemente quitar sin "!".
Comparar:
p "abc".strip! == " abc ".strip! # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip # true
Además, es imposible hacerlo strip
sin duplicados. Ver fuentes en string.c:
static VALUE
rb_str_strip(VALUE str)
{
str = rb_str_dup(str);
rb_str_strip_bang(str);
return str;
}
rubí 1.9.3p0 (2011-10-30) [i386-mingw32]
Actualización 1: Como veo ahora, se creó en el año 1999 (ver rev. n.° 372 en SVN):
Actualización 2:
strip!
no creará duplicados, tanto en la versión 1.9.x, 2.x como en la troncal.
Si estás usando Ruby on Rails hay un aplastamiento
> @title = " abc "
=> " abc "
> @title.squish
=> "abc"
> @title
=> " abc "
> @title.squish!
=> "abc"
> @title
=> "abc"
Si estás usando solo Ruby, querrás usar strip.
Aquí está el problema... ¡en tu caso quieres usar strip sin la explosión!
mientras te desnudas! ciertamente devuelve nil si no hubo ninguna acción, aún actualiza la variable, ¡así que quítate! no se puede utilizar en línea. Si desea utilizar strip inline, puede utilizar la versión sin explosión.
¡banda! utilizando un enfoque multilínea
> tokens["Title"] = " abc "
=> " abc "
> tokens["Title"].strip!
=> "abc"
> @title = tokens["Title"]
=> "abc"
enfoque de tira de una sola línea... TU RESPUESTA
> tokens["Title"] = " abc "
=> " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
=> "abc"