为什么以下代码无法正常运行?

时间:2020-03-08 23:48:47

标签: ruby

array = ["car","carrs"]
array.each { |x|
x.capitalize
}

我也尝试过通过删除花括号并在.each之后添加do来做do,我也尝试了数组中的每个,但这也没有用。我做错什么了吗,因为没有大写?

2 个答案:

答案 0 :(得分:5)

String#capitalize返回对象的副本,首字母大写。基本上,您要做的是遍历数组并生成字符串的新副本,然后立即将它们丢弃。

您有几种方法可以解决此问题:

  1. 您可以使用#map而不是#each来获取循环块主体的每个结果并将其收集到新数组中:
array = ["car","carrs"]
capitalized_array = array.map { |x| x.capitalize }
  1. 或者,如果您实际上想更改原始字符串,请使用String#capitalize!而不是capitalize,它会更改输入对象,而不是返回新对象:
array = ["car","carrs"]
array.each { |x| x.capitalize! }

尽管使用诱变版本似乎很诱人,但使用非诱变方法来生成数据转换通常是一个好主意,这样就不会丢失原始输入数据。通过使数据状态更难以推理,原位突变会引入细微的错误。

答案 1 :(得分:3)

您必须了解mapeach之间的区别。您可以阅读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 }

现在,mapmap!有什么区别?我们需要阅读documentation

map为self的每个元素调用一次给定的块。创建一个包含该块返回的值的新数组。 map!为self的每个元素调用一次给定的块时,将其替换为该块返回的值。