Ruby:迭代器没有按预期工作

时间:2014-05-19 21:59:32

标签: ruby

我不明白为什么这不起作用。我现在只用ruby编程了几个月,但我觉得我至少知道基础知识,这对我来说似乎是基本的。为什么这个each迭代器不会大写数组中的每个元素?我觉得这应该有用,感觉就像一个没脑子的人。我觉得我之前曾做过这样的事情一百万次而且他们按预期工作了,但由于某种原因,这不起作用?这是我对数组如何工作的误解吗?我觉得情况就是这样,但是当我把数组[0] .capitalize放入时,它会按预期大写元素。为什么each迭代器不会这样做?这绝对让我疯狂,并且基本上阻碍了我做类似事情的大项目。

array = []

array << "apple"
array << "banana"
array << "peach"

array.each do |x|

    x.capitalize

end

puts array #returns all non-capitalized words
puts array[0].capitalize #returns Apple...wtf why doesn't for loop work then?!?
puts "apple".capitalize #returns Apple as expected

6 个答案:

答案 0 :(得分:4)

问题是你正在调用的方法。 capitalize不对字符串进行任何修改,而是返回一个新字符串。您想致电capitalize!

x = "apple"
puts x.capitalize # "Apple"
puts x # "apple"
x.capitalize!
puts x # "Apple"

另一个选择是使用collect创建一个新数组,如下所示:

array = ["apple"]
new_array = array.collect do |x|
  x.capitalize
end
puts array # ["apple"]
puts new_array # ["Apple"]

答案 1 :(得分:0)

当你这样做时

x.capitalize

它返回字符串的副本。要做你想做的事,你应该把那一行改为

x.capitalize!

将修改现有元素,而不是返回副本。

答案 2 :(得分:0)

capitalize创建一个新字符串,不要修改起始字符串。使用capitalize!代替capitalizemap!代替each

答案 3 :(得分:0)

我刚刚在irb中进行了快速测试,而array.map将创建一个新的数组,其中个人资本化。 array.each将遍历并执行您想要的任何数组值的副本,但不能更改数组。如果你想改变数组,我会尝试

array = array.map do |x|
  x.capitalize
end

答案 4 :(得分:0)

这是一种稍微提高一点的红宝石方式:

array.map! &:capitalize

答案 5 :(得分:-1)

您可以做的最好的事情是转到终端中的irb并简单地在您的循环中放置puts以查看实际发生的情况。在那里,您可以看到每个时间输出大写且正确,但each方法对数组没有任何作用。它只针对每个元素进行迭代。这就是 final 输出是非大写元素的原因。

array = []

array << "apple"
array << "banana"
array << "peach"

array.each do |x|

  puts x.capitalize

end

irb中的印刷值:

Apple
Banana
Peach

但是 实际返回的值是这个 =&GT; [“apple”,“banana”,“peach”]