2015-05-29 40 views
0

這只是返回原來的name多種方法調用

name = "George" 
name.reverse.upcase! 
puts(name) 

我想知道爲什麼,如果有什麼辦法可以做我上面試過的。

+0

是的,你可以做到這一點。在紅寶石裏,一切都是一個對象。 name是一個String對象,你做的第一個調用是'name.reverse'。這也返回一個String對象。這個對象也理解'upcase'等方法。 – hotfix

+0

你試圖做什麼? – sawa

+0

它不會返回原始名稱。它返回'nil'。 – sawa

回答

3

reverse返回一個新的字符串。 upcase!提升它在就地調用的字符串。您正在創建一個新的反轉字符串,將該新字符串加上,然後再次使用它。

如果你想扭轉和upcase原始字符串,你可以name.reverse!.upcase!

+0

非常感謝! – Chris

+0

..如果你不想改變(改變)'name':'revup = name.reverse.upcase#=>「EGROEG」'。 –

2

您呼叫的方法不影響調用對象。 name.reverse將返回一個新的字符串,並保留原文。你想要做的是在你打電話後重新分配姓名。

name = George 
name = name.reverse.upcase 

在這種爆炸方法中存在一個問題,以!通常會修改正在操作的對象。所以你可以做下面的事情:

name = George 
name.reverse!.upcase! 

一般來說,我會避免!方法,除非你有充分的理由。設置「name =」的第一個例子非常清晰,易於閱讀且毫不含糊。

+0

謝謝,我可以看到我現在做錯了什麼! – Chris

0

或許,這將有助於解釋發生了什麼:

name = "George" # => "George" 
name.object_id # => 70228500576040 

object_id是實際變量的內存引用,換句話說,它生活的地方作爲腳本運行。

reversed_name = name.reverse # => "egroeG" 
reversed_name.object_id  # => 70228500574980 

我們可以告訴大家,reverse創造了一個新的變量,因爲object_id是從的name不同。

upcased_reversed_name = reversed_name.upcase! # => "EGROEG" 
upcased_reversed_name.object_id    # => 70228500574980 

upcase!的方法修改的同一變量作爲reversed_name

如果我們使用upcase代替,因爲變量的新版本中創建object_id變化:

upcased_reversed_name = reversed_name.upcase # => "EGROEG" 
upcased_reversed_name.object_id    # => 70228500572960 
upcased_reversed_name # => "EGROEG" 

簡短的教訓是!方法的結果,因爲它作用於你不能分配給一個變量原始變量並將其更改。