Что случилось с тем, как ruby ​​изменяет переменные таким образом? - PullRequest
0 голосов
/ 13 декабря 2010

Извините за смутный вопрос.Мне не хватает слов, чтобы описать это явление, поэтому Google не сильно помог.Пожалуйста, рассмотрите следующий код:

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

Это дает:

name age
Jim 36
Jim 36
Jim 36

, что противоречит тому, что я ожидал:

name age
Joe 32
Tom 45
Jim 36

Почему arrayпостфактум, изменив a?

Ответы [ 2 ]

5 голосов
/ 13 декабря 2010

Вы хотите установить a для нового Array объекта внутри each. На данный момент вы помещаете один и тот же a объект в массив, поэтому он возвращает одно и то же значение три раза. Еще лучше было бы вообще не использовать a и вместо этого конвертировать код во что-то вроде этого:

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

Вы можете сделать его меньше, даже если переместить line.split в метод push, но я думаю, что это снижает читабельность и не объясняет, какую информацию вы получаете из split.

0 голосов
/ 13 декабря 2010

Это немного сложнее, но основывается на ответе Райана, а не на

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

, вы можете использовать функцию map и иметь

people = x.map do |line|
  name, age = line.split(/\s/)
  [name, age]
end

desired_result = [["name", "age"]] + people

Это немного более "функциональный" подход к программированию. Я уверен, что это очень грубое резюме, но в функциональном программировании вы не изменяете существующие объекты, вы просто создаете новые объекты.

Кроме того, если вы хотите проверить ответ Райана, вы можете использовать object_id для каждого из объектов:

array.each_with_index do |object, index|
  puts "Object #{index} (which is #{object.inspect}) has an object id of #{object.object_id}"
end

что дает

Object 0 (which is ["name", "age"]) has an object id of 10204144
Object 1 (which is ["Jim", "36"]) has an object id of 10248384
Object 2 (which is ["Jim", "36"]) has an object id of 10248384
Object 3 (which is ["Jim", "36"]) has an object id of 10248384
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...