Thêm vào một chuỗi hiện có


104

Để thêm vào một chuỗi hiện có, đây là những gì tôi đang làm.

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

Có cách nào tốt hơn để nối vào một chuỗi hiện có không.

Trước khi ai đó gợi ý câu trả lời sau đây lemme cho thấy rằng câu trả lời này không hoạt động

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

Trong trường hợp trên object_id sẽ khác nhau đối với hai trường hợp.

Câu trả lời:


166

Bạn có thể sử dụng <<để nối vào một chuỗi tại chỗ.

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

1
Làm thế nào để bạn làm s <<! "bar", như trong để sửa đổi trạng thái của đối tượng? ! concat ( "bar") không làm việc ...
xxjjnn

@RainbowPony Như câu trả lời của tôi hiển thị, <<đã sửa đổi trạng thái của đối tượng. Cũng vậy concat.
sepp2k 21/12/12

Không phải lúc nào: 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 là một phiên bản của Widget. Nó có thể có ghi chú. tin nhắn là attr_accessible.
xxjjnn 21/12/12

1
@RainbowPony Có, luôn luôn. Trong trường hợp của bạn, bạn lấy lại chuỗi không thay đổi vì widget.notes.where(:author_id => a).firstcó lẽ mỗi lần trả về một đối tượng mới, đối tượng này sẽ có chuỗi độc lập của riêng nó.
sepp2k 21/12/12

Ah. Tôi vừa hỏi một câu hỏi mới stackoverflow.com/questions/13989619/…, cảm ơn vì sự trợ giúp!
xxjjnn 21/12/12

56

bạn cũng có thể sử dụng như sau:

s.concat("world")

4
<<cũng nên có thể phân phối được, vì nó trả về chuỗi.
scottysseus

Thật vậy - và << cũng ngắn hơn để viết AND trông tương tự như biến thể cout C ++. << là vẻ đẹp!
shevy

1
Lưu ý: điều này sửa đổi chuỗi gốc. Sử dụng cẩn thận.
Damien Roche

3

Tôi có thể hỏi tại sao điều này lại quan trọng?

Tôi biết rằng đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng thực tế là bạn đang cố gắng duy trì ID đối tượng của một chuỗi có thể cho thấy rằng bạn nên xem lại những gì bạn đang cố gắng thực hiện.

Ví dụ: bạn có thể thấy rằng việc dựa vào ID đối tượng của một chuỗi sẽ dẫn đến các lỗi khá khó theo dõi.


4
Có thể để sửa đổi các thông số bằng cách tham khảo? (đó là thiết kế xấu có thể xảy ra trong một ngôn ngữ oop full-fledged)
hurikhan77

4
Hay chỉ để tránh tạo ra quá nhiều đối tượng mới? Điều đó hoàn toàn hợp lý.
James A. Rosen

1
Chắc chắn nếu bạn sửa đổi một chuỗi tại chỗ và một đối tượng mới được tạo ra, thì đối tượng cũ sẽ được thu gom? Chúng ta có thực sự nên lo lắng về số lượng các đối tượng Chuỗi mà chúng ta tạo ra không?
Shadowfirebird

@Shadowfirebird Có lẽ anh ấy đang viết một phương thức được gọi là 1000 lần một giây và không muốn sa lầy vào bộ thu gom rác của mình với một mớ dây.
Michael Dorst,


1

Đây là một cách khác:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.