我最近开始学习Ruby,我正在尝试下面这段代码。
a=[1,2]
b='slam dunk'
a.each { |b| c=a*b; puts c;}
我得到以下输出。我不知道为什么。我预计会出现错误或某些事情。有人可以解释一下为什么会这样吗?
1
2
1
2
1
2
由于
答案 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在循环内部没有影响 在第一个循环中,您将打印一次阵列 在第二个循环中,您将打印阵列两次