array = ["car","carrs"]
array.each { |x|
x.capitalize
}
我也尝试过通过删除花括号并在.each之后添加do来做do,我也尝试了数组中的每个,但这也没有用。我做错什么了吗,因为没有大写?
答案 0 :(得分:5)
String#capitalize返回对象的副本,首字母大写。基本上,您要做的是遍历数组并生成字符串的新副本,然后立即将它们丢弃。
您有几种方法可以解决此问题:
array = ["car","carrs"]
capitalized_array = array.map { |x| x.capitalize }
capitalize
,它会更改输入对象,而不是返回新对象:array = ["car","carrs"]
array.each { |x| x.capitalize! }
尽管使用诱变版本似乎很诱人,但使用非诱变方法来生成数据转换通常是一个好主意,这样就不会丢失原始输入数据。通过使数据状态更难以推理,原位突变会引入细微的错误。
答案 1 :(得分:3)
您必须了解map
与each
之间的区别。您可以阅读here。
对于那些不想读的人:
Each
就像map
的原始版本。它为您提供了所有元素,因此您可以使用它,但是它不会收集结果。Each
始终返回原始的,不变的对象。尽管map
做同样的事情,但是。它返回一个包含转换后元素的新数组。
因此,您必须使用map才能返回新数组:
array = ["car","carrs"]
capitalized_array = array.map { |x| x.capitalize }
# or
array = ["car","carrs"]
array.map! { |x| x.capitalize }
现在,map
和map!
有什么区别?我们需要阅读documentation
map
为self的每个元素调用一次给定的块。创建一个包含该块返回的值的新数组。map!
为self的每个元素调用一次给定的块时,将其替换为该块返回的值。