2013-01-02 74 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