将数组中的单词大写,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(' ')
我正在查看 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(' ')