Проблема управления переменными в Ruby - PullRequest
2 голосов
/ 21 ноября 2011

Я пытаюсь выяснить, почему следующие коды не возвращают тот же результат:

КОД 1

p0 = "hello"
a = []
b = p0
1.upto(5) do |i|
  b.insert(2,"B")
  a.push b
end

a => ["heBBBBBllo", "heBBBBBllo", "heBBBBBllo", "heBBBBBllo", "heBBBBBllo"]

КОД 2

p0 = "hello"
a = []
b = p0
1.upto(5) do |i|
  b.insert(2,"B")
  a.push b.inspect
end

a => ["\"heBllo\"", "\"heBBllo\"", "\"heBBBllo\"", "\"heBBBBllo\"", "\"heBBBBBllo\""]

Мне нужен результат кода 2, но мне не нужен экранированный символ, как метод inspect.

Честно говоря, я действительно не понимаюпочему с методом inspect работает, а почему в коде 1 нет.Похоже, что в коде 1 «b» используется в качестве указателя, и каждый раз, когда он обновляется, обновляются все «связанные» -b.

Любая подсказка ??

благодарюВы заранее.

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

В коде 1 вы нажимаете ссылки на один и тот же объект.Массив будет содержать несколько ссылок на одно и то же.

В коде 2 вы нажимаете вывод inspect в определенный момент времени.Массив будет содержать историю возвращенных строк inspect.

1 голос
/ 21 ноября 2011
p0 = "hello"
a = []
b = p0

1.upto(5) do |i|
  b.insert(2,"B")
  a.push b.clone
end
0 голосов
/ 21 ноября 2011

Кажется, что в коде 1 в качестве указателя используется «b», и каждый раз, когда он обновляется, обновляются все «связанные» -b.

Правильно!В первом случае вы вводите b в массив пять раз, поэтому в результате a содержит пять указателей на b.Во втором случае вы нажимаете b.inspect - это объект, отличный от b.

Самый простой способ исправить ваш первый пример - вместо этого вызвать a.push b.dup, что создает дубликатb, который не будет затронут будущими изменениями b.

0 голосов
/ 21 ноября 2011

'b' - это строка, которая является объектом.Когда вы вставляете букву, она модифицирует объект.

В КОДЕ 1 один и тот же объект b вставляется в массив несколько раз и изменяется несколько раз.

Однако b.inspect возвращает новую строку.Таким образом, в КОДЕ 2 вы вставляете новую строку в массив каждую итерацию, и эта новая строка представляет собой снимок того, как «b» выглядел в то время.который создает копию b без изменения формата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...