2013-04-26 28 views
7

bất cứ ai có thể giải thích hành viPhân bổ chuỗi theo tham chiếu/sao chép?

Kịch bản-1

str = "hello" 
str1 = str 
puts str #=> hello 
puts str1 #=> hello 

str1 = "hi" 
puts str1 #=> hi 
puts str #=> hello 

Ở đây, thay đổi giá trị của str1 không ảnh hưởng đến giá trị của str.

Kịch bản-2

str = "hello" 
str1 = str 
str1.gsub! "hello", "whoa!" 
puts str1 #=> whoa 
puts str #=> whoa 

Shoudn't tác gsub! chỉ str1? Tại sao nó thay đổi str? Nếu str1 chỉ giữ tham chiếu đến str, thì tại sao giá trị không thay đổi trong Kịch bản-1?

Trả lời

16

Look dưới đây một cách cẩn thận:

Kịch bản-1

str = "hello" 
str1 = str 
puts str #=> hello 
puts str1 #=> hello 
p str.object_id #=>15852348 
p str1.object_id #=> 15852348 

Trong trường hợp trên strstr1 giữ tham chiếu đến cùng một đối tượng mà bằng chứng là các object_id. Bây giờ bạn sử dụng biến cục bộ str1 trong trường hợp dưới đây để giữ một đối tượng mới "hi", cũng được chứng minh bằng hai khác nhau object_id s.

str1 = "hi" 
puts str1 #=> hi 
puts str #=> hello 
p str.object_id #=> 15852348 
p str1.object_id #=> 15852300 

Kịch bản-2

`String#gsub! nói:

Thực hiện các thay của String # gsub tại chỗ, trở về str, hoặc nil nếu không có thay thế được thực hiện. Nếu không có khối và không có thay thế được đưa ra, một điều tra viên được trả lại để thay thế.

str = "hello" 
str1 = str 
str1.gsub! "hello", "whoa!" 
puts str1 #=> whoa 
puts str #=> whoa 
p str.object_id #=>16245792 
p str1.object_id #=>16245792 
+1

Bạn đang đánh bại tôi với nó .... +1 – Salil

+1

Câu trả lời hay bằng văn bản. –

+0

Điều này có đúng với mọi thứ không? Tất cả mọi thứ là một đối tượng và tất cả mọi thứ được chỉ định bằng cách tham khảo? Bao gồm những thứ khác thường là nguyên thủy trong các ngôn ngữ khác như số nguyên hoặc phao nổi? –

0

Trong giao biến, nó không có hiệu lực cho dù đã có một biến có cùng tên, và nếu như vậy, những gì giá trị của nó là gì. Trong trường hợp 1, str cuối cùng được gán str1 = "hi" và bất kỳ điều gì xảy ra với nó trước đó không liên quan. Kịch bản-1 giống như sau mà không có str1 = str.

str = "hello" 
str1 = "hi" 

Trong trường hợp 2, strstr được tham chiếu đến cùng một chuỗi. Nếu bạn thay đổi thông qua một trong các biến trỏ đến chuỗi đó, thì khi bạn gọi nó qua biến khác, nó đề cập đến cùng một chuỗi đã thay đổi.

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