在数组中大写单词,Ruby

时间:2015-03-06 02:21:04

标签: ruby arrays string capitalize

我正在浏览App Academy的Ruby Prep问题,我想知道为什么这个解决方案有效。似乎单词数组永远不会改变,但该方法仍然有效。这是矩阵中的故障,还是在我的鼻子下?

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

3 个答案:

答案 0 :(得分:2)

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

word = words[idx]

您只是使用word作为操作该数组元素的简写,该数组元素将被修改:

word[0] = word[0].upcase

-

另外,如果您在学习了一些Ruby之后想回到这个答案,那么这里是该方法的简化版本:

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

答案 1 :(得分:1)

String#[]=是一项变异操作。使用您的代码中包含的简明摘要来说明:

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

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

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

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

答案 2 :(得分:0)

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