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

标签 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] 

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

最佳答案

这是因为 word 变量持有对象的引用 - 与 words 数组中的对象相同。所以如果你修改这个对象,数组中的对象也会被修改,因为它是一样的。 顺便说一句,您在这里尝试做的事情可以更容易地完成:

string.split(' ').map(&:capitalize).join(' ')

正如 Stefan 所建议的:请记住 capitalize 不仅将第一个字符转换为大写,而且还将所有剩余字符转换为小写。如果这不是你想要的,你也可以这样做:

string.split(' ').map { |word| word.slice(0, 1).upcase + word.slice(1..-1) }

或将 Stefan 的解决方案与正则表达式一起使用:

string.gsub(/\b\w/) { |ch| ch.upcase }

请记住,正则表达式中的 \b 不仅会按空格“拆分”您的单词,还会按任何单词边界“拆分”。

关于ruby - 在 while 循环中设置变量 (Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28233704/

相关文章:

ruby - erb sudoers 迭代数组的哈希值

ruby-on-rails - FactoryGirl initialize_with 多个参数

Ruby 的 YAML 只从大文件中加载第一条记录,为什么?

ruby-on-rails - Rails 不使用模型指定的表

ruby-on-rails - ruby on rails 和 bootstrap,使 field_with_errors 水平显示

ruby-on-rails - gem 安装ruby-audio-1.6.1错误(使用Mac OS 10.9/Homebrew)

ruby-on-rails - Rails 路由配置错误

ruby-on-rails - 从 ruby​​ 守护进程中调试 osascript 执行

ruby - 另一个与 "diff.*\n.*\n.*\n.*\n.*\n "相同的正则表达式

ruby - 为什么不在 here-doc 作品中屏蔽参数?