¿Cuál es la forma canónica de recortar una cadena en Ruby sin crear una nueva cadena?

Resuelto Gishu asked hace 15 años • 9 respuestas

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!

Gishu avatar Jun 16 '09 17:06 Gishu
Aceptado

Supongo que lo que quieres es:

@title = tokens[Title]
@title.strip!

El #strip!método regresará nilsi 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 irbpara demostrar:

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"
Igor avatar Jun 16 '2009 11:06 Igor

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 stripsin 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.

gaRex avatar Apr 08 '2012 10:04 gaRex

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"
gateblues avatar Oct 27 '2015 21:10 gateblues