Anexar a uma string existente


104

Para anexar a uma string existente é o que estou fazendo.

s = 'hello'
s.gsub!(/$/, ' world');

Existe uma maneira melhor de anexar a uma string existente.

Antes que alguém sugira a seguinte resposta deixe-me mostrar que este não funciona

s = 'hello'
s.object_id
s = s + ' world'
s.object_id 

No caso acima, object_id será diferente para dois casos.

Respostas:


166

Você pode usar <<para anexar a uma string no local.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true

1
Como você faz <<! "bar", como para modificar o estado do objeto? concat! ("bar") não funciona ...
xxjjnn

@RainbowPony Como minha resposta mostra, <<já modifica o estado do objeto. E também concat.
sepp2k de

Nem sempre: irb (main): 038: 0> widget.notes.where (: author_id => a) .first.message.concat ("Potato") => "Y halo thar! = DPotato" irb (main): 039: 0> widget.notes.where (: author_id => a) .first.message => "Y halo thar! = D" # widget é uma instância de Widget. Pode ter notas. a mensagem é attr_accessible.
xxjjnn

1
@RainbowPony Sim, sempre. No seu caso, você obtém a string inalterada porque, widget.notes.where(:author_id => a).firstpresumivelmente, retorna um novo objeto a cada vez, que terá sua própria string independente.
sepp2k

Ah. Acabei de fazer uma nova pergunta stackoverflow.com/questions/13989619/… obrigado pela ajuda!
xxjjnn

56

você também pode usar o seguinte:

s.concat("world")

4
<<deve ser encadeado também, uma vez que retorna a string.
scottysseus

Na verdade - e << também é mais curto para escrever E é semelhante à variante cout do C ++. << é linda!
shevy

1
Nota: isso modifica a string original. Use com cuidado.
Damien Roche

3

Posso perguntar por que isso é importante?

Eu sei que esta não é uma resposta direta à sua pergunta, mas o fato de que você está tentando preservar o ID do objeto de uma string pode indicar que você deve olhar novamente para o que está tentando fazer.

Você pode descobrir, por exemplo, que confiar no ID do objeto de uma string levará a erros que são bastante difíceis de rastrear.


4
Talvez para modificar os parâmetros por referência? (que provavelmente é um projeto ruim em uma linguagem oop completa)
hurikhan77

4
Ou apenas para evitar a criação de muitos objetos novos? Isso é perfeitamente razoável.
James A. Rosen,

1
Certamente, se você modificar uma string no local e um novo objeto for criado, o objeto antigo será coletado como lixo. Devemos realmente nos preocupar com o número de objetos String que criamos?
Shadowfirebird

@Shadowfirebird Talvez ele esteja escrevendo um método que é chamado 1000 vezes por segundo e não quer atolar seu coletor de lixo com um monte de strings.
Michael Dorst


1

Aqui está outra maneira:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.