在while循环中设置变量(Ruby)

时间:2015-01-30 10:21:40

标签: ruby

此代码将字符串中每个单词的首字母大写。 例如“这是一句话”变成“这是一句话”。

    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] 

将新的大写字母单词放回单词数组中?我认为当代码执行时,它总是以前进的方式工作,如果这种理解不正确,请告诉我。

2 个答案:

答案 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