É isso que tenho agora - que parece muito detalhado para o trabalho que está sendo realizado.
@title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?
Suponha que tokens é uma matriz obtida dividindo uma linha CSV. agora as funções como strip! chomp! et. todos retornam nulo se a sequência não foi modificada
"abc".strip! # => nil
" abc ".strip! # => "abc"
Qual é a maneira do Ruby dizer recortá-lo se ele contiver espaços extras à esquerda ou à direita sem criar cópias?
Fica mais feio se eu quiser fazer tokens[Title].chomp!.strip!
Respostas:
Eu acho que o que você quer é:
O
#strip!
método retornaránil
se não remover nada e a própria variável se tiver sido removida.De acordo com os padrões Ruby, um método com sufixo e um ponto de exclamação altera a variável no local.
Espero que isto ajude.
Atualização: Esta é a saída de
irb
para demonstrar:fonte
@title.tap &:strip!
? Isso parece mais limpo do que qualquer outra coisa.nil
menos que retirasse alguma coisa? Isso sem dúvida confundiu uma tonelada de pessoas (já que não faz sentido).Aliás, agora o ruby já suporta apenas strip sem "!".
Comparar:
Também é impossível
strip
sem duplicatas. Veja fontes em string.c:ruby 1.9.3p0 (30-10-2011) [i386-mingw32]
Atualização 1: Como eu vejo agora - ela foi criada em 1999 (veja a revisão nº 372 no SVN):
Atualização 2:
strip!
não criará duplicatas - nas versões 1.9.x, 2.xe tronco.fonte
strip!
é para isso.strip
. Estou entendendo mal alguma coisa? De que outra forma eu poderia interpretar "impossível remover sem duplicar"?strip!
akarb_str_strip_bang
.Não há necessidade de remover e chomp, pois a tira também remove os retornos de carro à direita - a menos que você tenha alterado o separador de registros padrão e é isso que você está fazendo.
A resposta de Olly já tem a maneira canônica de fazer isso em Ruby, mas se você se encontra fazendo muito isso, pode sempre definir um método para isso:
Dando:
Lembre-se também de que a instrução if impedirá
@title
de ser atribuída se o token for nulo, o que resultará na manutenção do valor anterior. Se você deseja ou não se importa de@title
sempre ser designado, pode mover a verificação para o método e reduzir ainda mais a duplicação:Como alternativa, se você estiver se sentindo aventureiro, poderá definir um método no próprio String:
Dando um dos seguintes:
fonte
Se você estiver usando Ruby on Rails, há um squish
Se você estiver usando apenas Ruby, você quer usar strip
Aqui está o truque .. no seu caso, você deseja usar a tira sem o estrondo!
enquanto tira! certamente retorna nulo se não houver ação, ele ainda atualiza a variável, então tira! não pode ser usado em linha. Se você deseja usar a tira em linha, pode usar a versão sem o estrondo!
faixa! usando abordagem de várias linhas
abordagem de linha única de tira ... SUA RESPOSTA
fonte
Eu acho que seu exemplo é uma abordagem sensata, embora você possa simplificá-lo um pouco como:
Alternativa, você pode colocá-lo em duas linhas:
fonte
Se você quiser usar outro método depois de precisar de algo como isto:
Desta forma, você pode retirar e ainda fazer alguma coisa depois :)
fonte
O meu caminho:
fonte
Se você possui o ruby 1.9 ou ativa o suporte, pode fazer simplesmente
Isso é muito legal, pois aproveita
:try
e:tap
método, que são os mais poderosos construções funcionais no rubi, na minha opinião.Uma forma ainda mais bonita, a passagem funciona como símbolos:
fonte
É perfeitamente possível que eu não esteja entendendo o tópico, mas isso não faria o que você precisa?
fonte