2013-03-17 89 views
5

我是Ruby和本站的新手。Ruby中的字符串運算符+和<<之間的區別

以下兩個函數是不同的,一個會改變函數外的變量,而另一個不會。

def m1 (x) 
    x << "4" 
end 

def m2 (x) 
    x = x + "4" 
end 


str="123" 

m2(str) #str remains unchanged 123 

m1(str) #str is changed to 1234 

我想確保我這個理解正確 -

當M1被調用時,引用STR被複制並傳遞給看到它爲x的函數。運算符< <更改引用原始str的x,所以str通過此操作進行更改。

當調用m2時,對str的引用被複制並傳遞給將其視爲x的函數。運算符+創建一個新字符串,賦值x = x +「4」只是將x重定向到新字符串,而不改變原來的str變量。

,對嗎?

感謝

method declarations and invokation

+0

'm2(str)'應該返回''1234「',那麼'm1(str)'應該返回''1234」',之後'str'將等於''1234「'。你確定你的結果嗎? – mraaroncruz 2013-03-17 14:54:24

+1

我使用'Ruby 1.9.3p392',它適用於我的情況。在這些方法之前加上'puts'並檢查。 – Davit 2013-03-17 14:54:33

+0

@tmpmember你的意思是「它的作用」在你的情況下是什麼? – mraaroncruz 2013-03-17 14:55:49

回答

10

String#+ :: str + other_str → new_str級聯,返回包含other_str連接起來以str一個新的String。

String#<< :: str << integer → str:追加 - 將給定對象連接到str

<<不會創建新的對象,其中如+一樣。

a = "str" 
#=> "str" 
a.object_id 
#=> 14469636 
b = a << "ing" 
#=> "string" 
a.object_id 
#=> 14469636 
b.object_id 
#=> 14469636 

a= "str" 
#=> "str" 
b = a + "ing" 
#=> "string" 
a.object_id 
#=> 16666584 
b.object_id 
#=> 17528916 

編輯

從您的意見,得到了你的觀點。請看下圖:

def m1 (x) 
x << "4" 
end 
#=> nil 
def m2 (x) 
x = x + "4" 
end 
#=> nil 

str="123" 
#=> "123" 

m2(str) 
#=> "1234" 

str 
#=> "123" 

這裏str爲你傳遞的方法m2()裏面的值沒有變化,所有的變化本地的方法按照上面的電話。因此,在str以下不會顯示此更改。要查看更改,您必須按如下所示調用它。

str = m2(str) 
#=> "1234" 

str 
#=> "1234" 

OR

你可以做的東西如下: - 在我經過的str參考地址而不是價值。

str = "abc" 
#=> "abc" 
str.object_id 
#=> 16250484 
ObjectSpace._id2ref(16250484) 
#=> "abc" 
def m1 (x) 
ObjectSpace._id2ref(x) << "4" 
end 
#=> nil 
m1(16250484) 
#=> "abc4" 
str 
#=> "abc4" 

希望它是有意義:)

乾杯!

+0

非常感謝你的幫助 – yonso 2013-03-17 19:04:41

+0

看到我的編輯,希望有所幫助。 – 2013-03-17 19:37:53

+0

是的非常感謝你,這個看似「無辜」的代碼示例實際上有很多背後的知識,你已經幫我看看:) – yonso 2013-03-17 21:05:05

2

<<連接運算符對字符串具有破壞性。這意味着它將操縱它所作用的變量,而不僅僅是返回表達式的結果。

例如:

str = "abc" 
puts str + "d" # "abcd" 

puts str # "abc" 

puts str << "d" # "abcd" 

puts str # "abcd" 
+0

非常感謝你的幫助 – yonso 2013-03-17 19:04:17

1

以下兩個功能是不同的,一個改變了功能外的變量和一個沒有。

這是錯誤的。 這兩種方法(它們都是方法,BTW,沒有函數,Ruby沒有函數;有一個根本區別)都沒有改變str變量。 m1修改對象變量指向,但這與修改變量本身完全不同。

+0

是的你是對的,這是我以後才明白的東西 – yonso 2013-03-18 11:10:48