使用`capitalize`或`capitalize!`

时间:2014-09-29 15:49:17

标签: ruby capitalize

Codecademy希望我编写如下代码来大写我输入的第一个字母:

print "What's your first name?"
firstname = gets.chomp
firstname2 = firstname.capitalize
firstname.capitalize!
puts "Your first name is #{first_name}!"

但是,我把它写成:

print "What's your first name?"
firstname = gets.chomp.capitalize
puts "Your first name is #{firstname}!"

它们都产生相同的结果,但我的方式似乎更容易和重点。我想知道这两个代码在产生相同结果时是否真的有任何不同。是否有特定原因要使用firstname.capitalize!执行额外步骤和重复,而不是仅将capitalize添加到gets

2 个答案:

答案 0 :(得分:2)

capitalize返回一个首字母大写的新字符串

capitalize!修改或改变原始字符串

2.1.1 :001 > string = 'hello'
 => "hello"
2.1.1 :002 > string.capitalize
 => "Hello"
2.1.1 :003 > string
 => "hello"
2.1.1 :004 > string.capitalize!
 => "Hello"
2.1.1 :005 > string
 => "Hello"

一般来说,变异对象不被视为是一种好习惯,因为它可能会导致意外结果。

考虑以下情况:

def i_will_capitalize(string)
  string.capitalize!
  puts string
end

def i_expect_the_original_string(string)
  puts string
end

string = 'hello'

i_will_capitalize(string) # Returns 'Hello'
i_expect_the_original_string(string) # Returns 'Hello' as well!

答案 1 :(得分:2)

capitalize!修改接收器字符串,而capitalize创建新字符串。如果您没有在原始形式的其他地方使用接收器字符串,使用前者更有效;它可以节省内存。在这样一个简短的脚本中,它没有太大的区别,但是在大型程序中进行大量的字符串操作时,它会产生巨大的差异。如果我的记忆是正确的,我会阅读SASS开发人员编写的内容,只需通过gsub替换早期版本代码中的gsub!,就可以获得很好的性能提升。

另一方面,如果您有可能在大写之前使用表单中的字符串,那么您应该按照自己的方式使用。