将数组中的单词大写,Ruby

Capitalizing words in an array, Ruby

我正在查看 App Academy 的 Ruby 准备题,我想知道为什么这个解决方案有效。看起来 words 数组从未改变,但该方法有效。这是矩阵中的故障,还是就在我眼皮子底下?

def capitalize_words(string)
  words = string.split(" ")

  idx = 0
  while idx < words.length
    word = words[idx]
    word[0] = word[0].upcase
    idx += 1
  end

  return words.join(" ")
end

word = word[idx] 创建您的数据的副本。然后它将修改该副本而不是原始数组中的单词。

简单的解决方案是:

def capitalize_words(string)
  words = string.split(" ")

  idx = 0
  while idx < words.length
    words[idx][0] = words[idx][0].upcase
    idx += 1
  end

  return words.join(" ")
end

该方法有效,因为 word 包含对数组位置的引用。所以当你分配:

word = words[idx]

您只是将 word 用作 shorthand 来操作该数组元素,该元素被修改为:

word[0] = word[0].upcase

--

此外,如果您想在学习一些内容后返回此答案 Ruby,这里是该方法的简化版本:

def capitalize_words(string)
  string.split.map(&:capitalize).join(' ')
end

String#[]= 是一个变异操作。为了说明使用代码中包含的简洁摘录:

word = "foo"
word[0] = word[0].upcase  # <-- verbatim from your code
word #=> "Foo"

word 仍然是数组 words 中包含的完全相同的对象(数组只包含对对象的引用,而不是其中的数据),但它已经 发生了变化就地。通常最好尽可能避免突变,因为它会使正在发生的事情变得不明显(如您所见)。

您的代码也可以使用 map & capitalize 更简洁地编写(并且没有任何突变):

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