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
?
答案 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!
,就可以获得很好的性能提升。
另一方面,如果您有可能在大写之前使用表单中的字符串,那么您应该按照自己的方式使用。