此代码将字符串中每个单词的首字母大写。 例如“这是一句话”变成“这是一句话”。
def capitalize_words(string)
words = string.split(" ")
idx = 0
while idx < words.length
word = words[idx]
word[0] = word[0].upcase
words[idx] = word #this line of code can be made redundant, but why?
idx += 1
end
return words.join(" ")
end
在while语句中,我不明白为什么第三行不必要。第二行将单词的第一个字母设置为大写:
word[0] = word[0].upcase
while语句如何知道引用回到上一行
word = words[idx]
将新的大写字母单词放回单词数组中?我认为当代码执行时,它总是以前进的方式工作,如果这种理解不正确,请告诉我。
答案 0 :(得分:3)
这是因为word
变量保存了对象的引用 - 与words
数组中的对象相同。因此,如果修改此对象,也会修改数组中的对象,因为它是相同的。
顺便说一句,你在这里尝试做的事情可以轻松完成:
string.split(' ').map(&:capitalize).join(' ')
正如Stefan建议的那样:请记住capitalize
不仅将第一个字符转换为大写字母,还将所有剩余的字符转换为小写字母。如果这不是你想要的,你也可以这样做:
string.split(' ').map { |word| word.slice(0, 1).upcase + word.slice(1..-1) }
或使用Stefan的regexp解决方案:
string.gsub(/\b\w/) { |ch| ch.upcase }
请注意,正则表达式中的\b
不仅可以通过空格“分割”您的单词,而且可以通过任何单词进行“分割”。
答案 1 :(得分:0)
如果您只使用ruby,请按照@Marek的回答使用答案:
string.split(' ').map(&:capitalize).join(' ')
如果您使用的是Ruby with Rails
,请使用此选项:
"this is a sentence".titleize