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?
Asumir tokens es una matriz obtenida dividiendo una línea CSV. ahora las funciones como tira! chomp! et. todos devuelven nil si la cadena no se modificó
"abc".strip! # => nil
" abc ".strip! # => "abc"
¿Cuál es la forma en que Ruby dice recortar si contiene espacios iniciales o finales adicionales sin crear copias?
Se pone más feo si quiero hacer tokens[Title].chomp!.strip!
Respuestas:
Supongo que lo que quieres es:
El
#strip!
método devolveránil
si no eliminó nada, y la variable en sí si se eliminó.Según los estándares de Ruby, un método con un signo de exclamación cambia la variable en su lugar.
Espero que esto ayude.
Actualización: Este es el resultado de
irb
demostrar:fuente
@title.tap &:strip!
? Eso parece más limpio que cualquier otra cosa.nil
menos que desnudara algo? Eso sin duda ha confundido a un montón de personas (ya que no tiene sentido).Por cierto, ahora Ruby ya admite solo tirar sin "!".
Comparar:
También es imposible
strip
sin duplicados. Ver fuentes en string.c:rubí 1.9.3p0 (30/10/2011) [i386-mingw32]
Actualización 1: como lo veo ahora, fue creado en el año 1999 (ver rev. 372 en SVN):
Actualización2:
strip!
no creará duplicados, tanto en las versiones 1.9.x, 2.xy troncales.fuente
strip!
está.strip
. ¿Estoy malinterpretando algo? ¿De qué otra manera podría interpretar "imposible de quitar sin duplicar"?strip!
akarb_str_strip_bang
.No hay necesidad tanto de strip como de chomp ya que strip también eliminará los retornos del carro final, a menos que haya cambiado el separador de registros predeterminado y eso es lo que está masticando.
La respuesta de Olly ya tiene la forma canónica de hacer esto en Ruby, aunque si te encuentras haciendo esto mucho, siempre podrías definir un método para ello:
Dando:
También tenga en cuenta que la instrucción if evitará que
@title
se asigne si el token es nulo, lo que hará que mantenga su valor anterior. Si desea o no le importa que@title
siempre se le asigne, puede mover el cheque al método y reducir aún más la duplicación:Como alternativa, si te sientes aventurero, puedes definir un método en String:
Dando uno de:
fuente
Si estás usando Ruby on Rails hay un squish
Si usa solo Ruby, quiere usar strip
Aquí yace el truco ... ¡en tu caso quieres usar strip sin el golpe!
mientras tira! Ciertamente devuelve nil si no hubo acción, todavía actualiza la variable, ¡así que tira! no se puede usar en línea. ¡Si quieres usar strip inline puedes usar la versión sin la explosión!
¡tira! utilizando un enfoque de varias líneas
tira enfoque de línea única ... SU RESPUESTA
fuente
Creo que su ejemplo es un enfoque sensato, aunque podría simplificarlo ligeramente como:
Alternativa, podría ponerlo en dos líneas:
fuente
Si desea utilizar otro método después de necesitar algo como esto:
De esta manera, puedes desnudarte y seguir haciendo algo después :)
fuente
Mi manera:
fuente
Si tiene ruby 1.9 o soporte activo, puede hacerlo simplemente
Esto es realmente genial, ya que aprovecha el
:try
y el:tap
método, que son las construcciones funcionales más poderosas en ruby, en mi opinión.Una forma aún más linda, pasando funciones como símbolos por completo:
fuente
Es completamente posible que no entienda el tema, pero ¿no haría esto lo que necesita?
fuente