ruby以这种方式改变变量的方式是什么?

jac*_*ack 0 ruby

抱歉这个模糊的问题.我无法用言语来描述这种现象,因此谷歌没有多大帮助.请考虑以下代码:

array = [["name", "age"]]
a = []

x = ["Joe 32",
     "Tom 45",
     "Jim 36"]

x.each do |line|
  name, age = line.split(/\s/)
  a[0] = name
  a[1] = age

  array.push(a)
end  

array.each do |x|
  puts x.join(" ")
end
Run Code Online (Sandbox Code Playgroud)

这会产生:

name age
Jim 36
Jim 36
Jim 36
Run Code Online (Sandbox Code Playgroud)

这与我的期望相反:

name age
Joe 32
Tom 45
Jim 36
Run Code Online (Sandbox Code Playgroud)

array事后通过修改为什么会受到影响a

Rya*_*igg 5

你想在里面设置a一个新的Array对象each.此刻,您将同一个 a对象推送到数组,这就是它返回相同值三次的原因.更好的是根本不使用a,而是将代码转换为这样的代码:

x.each do |line|
  name, age = line.split(/\s/)
  array.push([name, age])
end
Run Code Online (Sandbox Code Playgroud)

你甚至可以通过移动line.splitpush方法内部来使它小于它,但我认为这会降低可读性并且不能解释你从中得到的信息split.