Ruby 为什么我们需要初始化一个变量m,并且只初始化变量m,以便生成菱形象限?

Ruby 为什么我们需要初始化一个变量m,并且只初始化变量m,以便生成菱形象限?,ruby,Ruby,虽然我承认我可能是错的,但我可以说,为了生产 * ** *** **** ***** 对于#times do循环,您需要在循环之外初始化一个变量,并且只初始化该变量 比如说, m=0 5.times do m+=1 puts "*" * m end 生成前面提到的图像,但是 变式1 m=0 m+=1 5.times do puts "*" * m end 及 变式2 5.times do m=0 m+=1 puts "*" * m end 产生 * *

虽然我承认我可能是错的,但我可以说,为了生产

*
**
***
****
*****
对于#times do循环,您需要在循环之外初始化一个变量,并且只初始化该变量

比如说,

m=0
5.times do
  m+=1
  puts "*" * m 
end 
生成前面提到的图像,但是

变式1

m=0
m+=1
5.times do 
  puts "*" * m
end 

变式2

5.times do
  m=0
  m+=1
  puts "*" * m
end 
产生

*
*
*
* 
*
* 
* 
* 
* 
* 
=> 10 
为什么会这样

更有趣的是

变式3

6.times do 
  m=0
  puts "*" * m
  m+=1
end 

生成一系列6个空行,然后返回6。显然,变量初始化和迭代器的位置都很重要(至少对于#times do循环而言),但我的问题是为什么?如果这是一个“我知道你认为你想要一个答案,但你真的不想进入这个兔子洞”的例子,那么也许我们可以将其视为reddit“像我五岁一样向我解释”的有趣版本,stackoverflow风格。例如,在变量3中,由于m被初始化为0,我希望在第一次迭代中出现一个空行,因为我实际上是在告诉Ruby在那一刻将星号符号乘以m的值。然而,在第一次迭代结束时,我还希望m的值增加1。这几乎就像Ruby没有到达那一行,因为如果它到达了,那么第二次迭代应该包含值为1的m,从而生成一个带一个星号的行

显然,第一个变量不起作用,因为在循环中没有做任何事情来增加
m


第二个变量不起作用,因为在递增之前,您一直将其重置为
0

在变量1中,m被初始化,立即递增1,然后开始
do
循环。在循环中运行的5次中,每一次m都将是1,因为它是在循环外部定义的

在变量2中,您更接近,但是
do
循环将重置m,并在每次循环中递增1。在这两个示例中,当您
放置“*”


对于变量3,第一次通过循环时将有一个空行,因为
m=0
。但是,由于您正在循环执行这些命令,当m递增时,脚本将重复,因此第二次循环
m
将再次重置为0。使用irb可能会让您感到困惑——从终端运行相同的脚本将产生6行空行。我还没有充分使用irb来了解返回6的确切原因,但是我知道irb总是会返回一些东西,即使它是零

格林,我很感激你的解释。。。它有助于澄清充分的代码和不充分的变体之间的区别