2014-04-18 11 views
6

Tôi đang làm việc thông qua một hướng dẫn ngay bây giờ, và tôi muốn hiểu tại sao sau đây xảy ra:Tại sao `<<` nối thêm vào chuỗi Ruby trong khi `+ =` thì không?

original_string = "Hello, " 
hi = original_string 
there = "World" 
hi += there 
assert_equal "Hello, ", original_string 

original_string = "Hello, " 
hi = original_string 
there = "World" 
hi << there 
assert_equal "Hello, World", original_string 

Tại sao += không có hiệu lực trên original_string, và << không? Tôi hoàn toàn chắc chắn rằng trường hợp thứ hai cũng sẽ bằng "Hello, ", nhưng đó không phải là trường hợp.

hi = original string trong ví dụ đầu tiên xuất hiện để sao chép các giá trị của original_string vào hi, nhưng hi = original string trong ví dụ thứ hai xuất hiện để thiết lập hi để trỏ đến chuỗi giống như original string. Tôi đoán có một số loại quyết định tiềm ẩn đằng sau hậu trường là liệu có nên sao chép giá trị hay sao chép tham chiếu ... hay cái gì đó.

Trả lời

3

<< trên chuỗi đột biến đối tượng ban đầu khi += tạo ra một bản sao và trả về đó.

Xem object_id của chuỗi tương ứng dưới đây:

2.1.1 :029 > original_string = "Hello, " 
=> "Hello, " 
2.1.1 :030 > hi = original_string 
=> "Hello, " 
2.1.1 :031 > there = "World" 
=> "World" 
2.1.1 :032 > original_string.object_id 
=> 70242326713680 
2.1.1 :033 > hi.object_id 
=> 70242326713680 

2.1.1 :034 > hi += there 
=> "Hello, World" 
2.1.1 :035 > hi.object_id 
=> 70242325614780 

Lưu ý sự khác nhau object_id trên hi trên dòng 35. Khi bạn thiết lập lại hi để original_string trong ví dụ của bạn ở trên, và sử dụng <<, nó sẽ thay đổi cùng một đối tượng .

3

Trong cả hai ví dụ, hi = original_string sao chép tham chiếu.

Với +=, tuy nhiên, bạn chỉ định lại hi để trỏ đến một chuỗi mới, mặc dù tên biến là giống nhau.

Điều này là do hi += there mở rộng trong trình thông dịch thành biểu thức hi = hi + there.

Trước thao tác này, hioriginal string chia sẻ tham chiếu đến cùng một đối tượng chuỗi. Khi hoạt động = trong biểu thức được mở rộng, hi hiện tham chiếu đến kết quả chuỗi mới được tạo của hi + there.

Trong biểu thức hi << there, không có gì xảy ra để thay đổi đối tượng hi đề cập đến. Nó đề cập đến cùng một chuỗi như original_string và do đó cả hai hioriginal_string phản ánh thay đổi (dĩ nhiên là do cả hai đều tham chiếu cùng một đối tượng chuỗi).

Các vấn đề liên quan