我正在浏览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
答案 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