我不明白为什么这不起作用。我现在只用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
答案 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!
代替capitalize
或map!
代替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”]