기존 문자열에 추가


104

기존 문자열에 추가하려면 이것이 내가하는 일입니다.

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

기존 문자열에 추가하는 더 좋은 방법이 있습니까?

누군가가 다음 답변을 제안하기 전에 이것이 작동하지 않는다는 것을 보여주십시오.

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

위의 경우 object_id는 두 가지 경우에 다릅니다.

답변:


166

를 사용 <<하여 내부 문자열에 추가 할 수 있습니다 .

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

1
당신은 어떻게 s <<! 개체의 상태를 수정하는 것과 같이 "바"? ! CONCAT ( "바") ... 일을하지 않습니다
xxjjnn

@RainbowPony 내 대답에서 알 수 있듯이 <<이미 개체의 상태를 수정합니다. 그래서 않습니다 concat.
sepp2k

항상 그런 것은 아닙니다 : 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은 Widget의 인스턴스입니다. 메모가있을 수 있습니다. 메시지는 attr_accessible입니다.
xxjjnn

1
@RainbowPony 예, 항상. 귀하의 경우에는 widget.notes.where(:author_id => a).first아마도 매번 새로운 객체를 반환 하기 때문에 변경되지 않은 문자열을 다시 얻습니다 .
sepp2k

아. 방금 새로운 질문을했습니다. stackoverflow.com/questions/13989619/… 도움을 주셔서 감사합니다!
xxjjnn

56

다음을 사용할 수도 있습니다.

s.concat("world")

4
<<문자열을 반환하므로 체인도 가능해야합니다.
scottysseus

실제로-및 <<도 작성하는 데 더 짧으며 C ++ cout 변형과 유사합니다. <<는 아름다움입니다!
shevy

1
참고 : 이렇게하면 원래 문자열이 수정됩니다. 신중하게 사용하십시오.
Damien Roche

3

이것이 왜 중요한지 물어볼 수 있습니까?

이것이 귀하의 질문에 대한 직접적인 대답이 아니라는 것을 알고 있지만 문자열의 개체 ID를 유지하려는 사실은 수행하려는 작업을 다시 확인해야 함을 나타낼 수 있습니다.

예를 들어 문자열의 개체 ID에 의존하면 추적하기 매우 어려운 버그가 발생할 수 있습니다.


4
참조로 매개 변수를 수정 하시겠습니까? (본격적인 oop 언어에서 아마도 나쁜 디자인 일 가능성이 있습니다)
hurikhan77

4
아니면 너무 많은 새 개체를 만드는 것을 피하기 위해? 그것은 완벽하게 합리적입니다.
James A. Rosen

1
확실히 문자열을 제자리에서 수정하고 새 객체가 생성되면 이전 객체가 가비지 수집됩니까? 우리가 만드는 String 객체의 수에 대해 정말로 걱정해야할까요?
Shadowfirebird

@Shadowfirebird 아마도 그는 1 초에 1000 번씩 호출되는 메소드를 작성하고있을 것이고, 많은 문자열로 가비지 수집기를 멈출 것을 원하지 않을 것입니다.
Michael Dorst 2013


1

다른 방법이 있습니다.

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.