2013-01-02 73 views
0

的方法我目前使用capitalize!使用!在紅寶石

user_input.capitalize! 

但是,如果輸入的是大寫的,它返回一個零。

我知道我可以使用沒有!的方法,但它會複製對象並傳遞該對象而不是更改對象。如何使用!,但它適用於所有情況?

我試圖downcase一切,然後capitalize但在某些情況下存在相同的問題。

什麼是利用所有條目的最佳方法?

這是背景:

The user inputs "works", "Works", "WORKS", or "WoRkS" 
case 1) user_input = "works" 
case 2) user_input = "Works" 
case 3) user_input = "WORKS" 
case 4) user_input = "WoRkS" 

user_input.capitalize! (case 1,3,4 = "Works"; case 2 = nil) 
+0

'1.9.3p194:001>「WORKS」.capitalize! =>「作品」# – Andbdrew

+0

正確,但1.9.3p286:001>「Works」.capitalize! =>無 – FluxEngine

+0

請發佈您的代碼的上下文。 – Yossi

回答

4

!方法,按照慣例,修改接收器和返回零,如果他們不做任何更改。做最安全的方法是使用兩行:

user_name.capitalize! 
user_name 

#tap

user_name.tap do |s| 
    s.capitalize! 
end 

雖然#tap是矯枉過正這裏。

+0

所以,鑑於你需要重複'user_name',爲什麼不只是'user_name = user_name.capitalize'?也就是說,無論什麼東西在這裏沒有真正付出,我認爲需要使用'!'。 – Telemachus

+0

@Telemachus同意了,好點,但我只是回答他的核心問題 –

+1

夠公平,儘管有時我認爲最好的說法是「不要迷戀​​,只是做<顯而易見的事情>」。 – Telemachus

2

如果您只關心輸入是否大寫,請使用capitalize!,不要擔心nil

如果在代碼的某個位置(出於某種原因)不能有nil,請不要使用capitalize!。相反,這樣做:

user_input = user_input.capitalize 

在一天結束時,無論哪種方式都很好,習慣用法,並將輸入到你想要的狀態。本身,nil返回值並不是一件壞事 - 雖然你可能並不總是希望它作爲最終的返回值。

+0

但是,這只是使對象的副本,而不是改變實際的對象。這是使用這種方法的「正確」方式嗎?因此,而不是改變對象,只是讓它做一個副本? – FluxEngine

+1

我不確定你的真正問題是「大寫」還是「大寫!」。如果你所關心的是變量是大寫的,那麼'nil'返回值不一定非常重要。另一方面,如果由於某種原因特定於你的應用程序,那麼你不能在那裏有'nil',那麼執行'x = x.mutator'就可以了。這樣,返回值就是變異的x,無論如何。 – Telemachus

+0

換句話說,你真的想開始寫一個自定義的方法:(1)檢查項目是否大寫,然後(2)根據測試使用'capitalize'或'capitalize!';這真的很重要嗎?我們正在談論獲得一些形狀的字符串,對吧?這已經很簡單了。不要太難。 – Telemachus