2010-05-24 41 views
0

我最近开始学习Ruby,我正在尝试下面的一段代码。帮我解密这个输出

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

我收到以下输出。我不知道为什么。我期望有一个错误或某些东西被抛出。有人能解释我为什么发生这种情况吗

1 
2 
1 
2 
1 
2 

感谢

+0

我不要做红宝石,但我猜它是隐含的转换逻辑......如果你将slamdunk和b更改为[1,2]会发生什么? – 2010-05-24 08:56:58

+0

我试图做这样的改变,我得到一个错误**不能将字符串转换为整数(TypeError)** – bragboy 2010-05-24 09:00:10

+1

您可能希望执行'puts c.inspect'而不是'puts c',以便您可以看看发生了什么更好。 – 2010-05-25 00:06:17

回答

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,然后分配给数不产生错误,那么这是不是一个问题动态类型的语言,如红宝石。例如

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

你的每一个循环b后,将只有最后一个值它在循环,即2

4

块变量b覆盖“灌篮高手”,所以会发生什么是

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

这是你在输出

0

我觉得外b的内循环没有影响。
在第一个循环中,您打印阵列一次。
在第二个循环中,您可以两次打印阵列

1

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

那么每个循环实际上接收在每次通过是

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

所以第一通打印1个2和第二通打印1 2 1 2(即它打印阵列两次)