试图将字符串转换为符号

时间:2014-01-18 07:57:32

标签: ruby arrays

这会产生一个无限循环,我正在消隐为什么会发生这种情况。当我不使用push命令时,循环不会发生。

#strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
symbols = [ "a", "b", "c" ]
symbols.each do |x| 
  symbols.push(x.to_sym)
end

2 个答案:

答案 0 :(得分:5)

以下代码将项目附加到symbols数组(相同的数组),同时迭代它;该块通过附加到数组提供无限项。 (each使用这些项目进行迭代)

symbols.each do |x| symbols.push(x.to_sym) end
#^^^^^^             ^^^^^^^

改为使用Enumerable#map

symbols.map { |x| x.to_sym }
# => [:a, :b, :c]
symbols.map &:to_sym
# => [:a, :b, :c]

或使用其他数组而不是使用相同的数组。

new_symbols = []
symbols.each do |x| new_symbols.push(x.to_sym) end
new_symbols
# => [:a, :b, :c]

答案 1 :(得分:2)

这是因为,在每次使用#each方法的迭代中,您都会向原始数组symbols添加新元素。这会导致无限循环。而是使用Array#each_index

执行以下操作

代码 - 我

symbols = [ "a", "b", "c" ]
symbols.each_index do |i|
  symbols[i]=symbols[i].to_sym
end
symbols # => [:a, :b, :c]

但上面的代码将更新您的原始数组。您的代码稍作修改也可以正常工作:

代码 - II

symbols = [ "a", "b", "c" ]
nw_ary = symbols.each_with_object([]) do |e,a|
  a << e.to_sym
end
nw_ary # => [:a, :b, :c]

但您也可以使用symbols.map(&:to_sym)代替代码-II symbols.map!(&:to_sym)取代代码-I 。阅读Array#mapArray#map!