帮我解读这个输出

时间:2010-05-24 08:52:51

标签: ruby

我最近开始学习Ruby,我正在尝试下面这段代码。

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

我得到以下输出。我不知道为什么。我预计会出现错误或某些事情。有人可以解释一下为什么会这样吗?

1
2
1
2
1
2

由于

4 个答案:

答案 0 :(得分:4)

块变量b会覆盖“扣篮”,所以会发生什么

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

这是你在输出中看到的

答案 1 :(得分:2)

首先,我将尝试解释您所看到的输出。

在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这样的动态类型语言中不是问题。 e.g。

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

在每个循环b之后,它将具有循环中的最后一个值,即2

答案 2 :(得分:1)

当评估每个最初分配的变量b时,该值被块的b参数隐藏。

那么每个循环实际接收的每个循环是

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

所以第一遍打印1 2,第二遍打印1 2 1 2(即打印数组两次)

答案 3 :(得分:0)

我认为外部b在循环内部没有影响 在第一个循环中,您将打印一次阵列 在第二个循环中,您将打印阵列两次