2016-02-25 36 views
-2

雖然我當然承認,我可能是錯的,至於我可以告訴大家,爲了生產爲什麼我們需要初始化一個變量m,並且只有變量m才能產生一個菱形象限?

* 
** 
*** 
**** 
***** 

與#times做環,你需要初始化變量,只有這個變量,外循環。

例如,

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顯然,變量兩者的初始化和迭代器物質的放置(至少有#次做循環),但我的問題是爲什麼?如果這是「我知道你認爲你想要一個答案,但你真的不想放棄這個兔子洞」的情況下,那麼也許我們可以把它作爲一個有趣的reddit版本「解釋給我像我一樣五「,stackoverflow樣式。例如,在Variant 3中,由於m初始化爲0,因此我預計在第一次迭代時會出現空行,因爲我實際上告訴Ruby在此刻將星號符號乘以m的值。然而,在第一次迭代結束時,我還會期望m的值增加1.這幾乎就好像Ruby沒有達到那條線,因爲如果它確實如此,那麼第二次迭代應該包括m值爲1並因此產生帶有一個星號的行。

回答

0

很明顯,第一個變體將不起作用,因爲你不會在循環內部做任何事情來增加m

第二個變體將不起作用,因爲您在遞增之前將其重置爲0

1

在變量1中,m被初始化,立即增加1,然後開始循環do。 5次循環中的每一次,m都是1,因爲它是在循環外部定義的。

在變種2中,您距離更近,但do循環會將m重置並每次通過循環增加1。在這兩個示例中,當您使用puts "*"

時,m = 1使用變體3,您是正確的,在循環中第一次將自m = 0開始有空行。但是,由於您正循環執行這些命令,因此當m遞增時,腳本將重複,因此通過循環m的第二次重新設置爲0。你可能會通過使用irb讓自己感到困惑 - 運行終端上的相同腳本會產生6個空行。我沒有足夠的使用irb知道爲什麼返回6,但我知道irb總是會返回一些東西,即使它是零。

+0

glin,我很欣賞這個解釋......它有助於澄清足夠的代碼和不足的變體之間的區別 – user309190

相關問題