Помогите мне расшифровать этот вывод - PullRequest
0 голосов
/ 24 мая 2010

Я недавно начал изучать Ruby и пробовал следующий фрагмент кода.

a=[1,2]
b='slam dunk'
a.each { |b| c=a*b; puts c;}

Я получаю следующий вывод.Понятия не имею почему.Я ожидал ошибку или что-то, что будет брошено.Может кто-нибудь объяснить мне, почему это происходит?

1
2
1
2
1
2

Спасибо

Ответы [ 4 ]

4 голосов
/ 24 мая 2010

Переменная блока b перезаписывает "slam dunk", так что получается

c=[1,2]*1 # => [1,2]
c=[1,2]*2 # => [1,2,1,2]

Это то, что вы видите в выводе

2 голосов
/ 24 мая 2010

Сначала я попытаюсь объяснить вывод, который вы видите.

В ruby, если у нас есть массив, например [1, 2] и умножьте его на число n , тогда вы получите массив, повторенный n раз, например

irb(main):012:0> [1,2] * 2
=> [1, 2, 1, 2]

Итак, ваш each цикл печатает [1, 2] * 1, за которым следует [1, 2] * 2

Если вы спрашиваете, почему присвоение b для строки, а затем для номера не приводит к ошибке, то это не проблема в динамически типизированных языках, таких как ruby. например,

irb(main):017:0> a = 5
=> 5
irb(main):018:0> a = 'no problem'
=> "no problem"

После того, как каждый ваш цикл b будет просто иметь последнее значение, которое он имел в цикле, т.е. 2

1 голос
/ 24 мая 2010

При оценке каждой переменной b, которая была первоначально присвоена, значение скрывается аргументом b в блоке.

Так что каждый цикл фактически получает на каждом проходе

 [1,2] * 1 #1st Pass
 [1,2] * 2 #2nd Pass

Таким образом, 1-й проход печатает 1 2, а 2-й проход печатает 1 2 1 2 (т.е. он печатает массив дважды)

0 голосов
/ 24 мая 2010

Я думаю, что внешний б не имеет никакого эффекта внутри цикла.На первом цикле вы печатаете свой массив один раз.На втором цикле вы печатаете массив два раза

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