我最近开始学习Ruby,我正在尝试下面的一段代码。帮我解密这个输出
a=[1,2]
b='slam dunk'
a.each { |b| c=a*b; puts c;}
我收到以下输出。我不知道为什么。我期望有一个错误或某些东西被抛出。有人能解释我为什么发生这种情况吗
1
2
1
2
1
2
感谢
我最近开始学习Ruby,我正在尝试下面的一段代码。帮我解密这个输出
a=[1,2]
b='slam dunk'
a.each { |b| c=a*b; puts c;}
我收到以下输出。我不知道为什么。我期望有一个错误或某些东西被抛出。有人能解释我为什么发生这种情况吗
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
,然后分配给数不产生错误,那么这是不是一个问题动态类型的语言,如红宝石。例如
irb(main):017:0> a = 5
=> 5
irb(main):018:0> a = 'no problem'
=> "no problem"
你的每一个循环b
后,将只有最后一个值它在循环,即2
块变量b覆盖“灌篮高手”,所以会发生什么是
c=[1,2]*1 # => [1,2]
c=[1,2]*2 # => [1,2,1,2]
这是你在输出
我觉得外b的内循环没有影响。
在第一个循环中,您打印阵列一次。
在第二个循环中,您可以两次打印阵列
当计算最初分配的每个变量b时,该值被该块的b参数隐藏。
那么每个循环实际上接收在每次通过是
[1,2] * 1 #1st Pass
[1,2] * 2 #2nd Pass
所以第一通打印1个2和第二通打印1 2 1 2(即它打印阵列两次)
我不要做红宝石,但我猜它是隐含的转换逻辑......如果你将slamdunk和b更改为[1,2]会发生什么? – 2010-05-24 08:56:58
我试图做这样的改变,我得到一个错误**不能将字符串转换为整数(TypeError)** – bragboy 2010-05-24 09:00:10
您可能希望执行'puts c.inspect'而不是'puts c',以便您可以看看发生了什么更好。 – 2010-05-25 00:06:17