ต่อท้ายสตริงที่มีอยู่


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
คุณทำได้อย่างไร <<! "bar" เช่นเดียวกับการปรับเปลี่ยนสถานะของวัตถุ? concat! ("bar") ไม่ทำงาน ...
xxjjnn

@RainbowPony ตามที่คำตอบของฉันแสดงให้เห็นว่า<<ได้ปรับเปลี่ยนสถานะของวัตถุแล้ว ก็concatเช่นกัน
ก.ย. 2

ไม่เสมอไป: 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สันนิษฐานว่าจะส่งคืนอ็อบเจ็กต์ใหม่ทุกครั้งซึ่งจะมีสตริงอิสระของตัวเอง
ก.ย. 2

อา. ฉันเพิ่งถามคำถามใหม่stackoverflow.com/questions/13989619/…ขอบคุณสำหรับความช่วยเหลือ!
xxjjnn

56

คุณยังสามารถใช้สิ่งต่อไปนี้:

s.concat("world")

4
<<ควรเป็นแบบ chainable เช่นกันเนื่องจากส่งคืนสตริง
scottysseus

แน่นอน - และ << ยังสั้นกว่าในการเขียนและดูเหมือนกับตัวแปร C ++ cout << คือความงาม!
shevy

1
หมายเหตุ: สิ่งนี้จะปรับเปลี่ยนสตริงเดิม ใช้อย่างระมัดระวัง
Damien Roche

3

ฉันถามได้ไหมว่าทำไมสิ่งนี้ถึงสำคัญ?

ฉันรู้ว่านี่ไม่ใช่คำตอบโดยตรงสำหรับคำถามของคุณ แต่การที่คุณพยายามรักษา ID ออบเจ็กต์ของสตริงอาจบ่งบอกว่าคุณควรพิจารณาสิ่งที่คุณกำลังพยายามทำอีกครั้ง

ตัวอย่างเช่นคุณอาจพบว่าการใช้ ID อ็อบเจ็กต์ของสตริงจะทำให้เกิดข้อบกพร่องที่ยากต่อการติดตาม


4
อาจจะแก้ไขพารามิเตอร์โดยการอ้างอิง? (ซึ่งน่าจะเป็นการออกแบบที่ไม่ดีในภาษา
อู๊ป

4
หรือเพียงเพื่อหลีกเลี่ยงการสร้างวัตถุใหม่มากเกินไป? นั่นสมเหตุสมผลอย่างยิ่ง
James A. Rosen

1
แน่นอนว่าหากคุณแก้ไขสตริงและสร้างวัตถุใหม่วัตถุเก่าจะถูกเก็บรวบรวมขยะ? เราควรกังวลเกี่ยวกับจำนวนวัตถุ String ที่เราสร้างหรือไม่?
Shadowfirebird

@Shadowfirebird บางทีเขาอาจจะเขียนวิธีที่เรียกได้ว่า 1,000 วินาทีต่อวินาทีและไม่ต้องการที่จะยุ่งกับคนเก็บขยะของเขาด้วยสายอักขระมากมาย
Michael Dorst


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.