2014-03-28 24 views
-1

我想添加366的天數,如果它可以被4整除,如果不是365可以整除。爲什麼如何使forntr語句在for循環中工作?

amountOfDays = 0 
for i in 0..100 
    i % 4 == 0 ? amountOfdays += 366 : amountOfdays += 365 
end 

不工作?它說undefined method + for nil:NilClass

我怎樣才能使它工作?

+0

我認爲你的意思是「和365如果不是」。 – Addison

+0

@addison True .. –

回答

1

有一個在你的代碼一個錯字。在頂部設置amountOfDays(大寫字母D),然後使用amountOfdays。 Ruby將變量初始化爲nil,因爲它被分配給(是的,在這種情況下有點奇怪)。例如:

a += 10 
# NoMethodError: undefined method `+' for nil:NilClass 

而不是

a + 10 
# NameError: undefined local variable or method `a' for main:Object 

這將是一個有點容易診斷。

此外,您正在使用(i % 4)表達式,因爲它返回一個布爾值,但它返回一個數字。在紅寶石中,除falsenil之外的所有內容都會評估爲true(實際上是「truthy」),因此您的條件永遠不會是錯誤的。

最後,因爲你正在使用ternaries,你還不如用一個事實,即它們都是表達式:

amountOfDays = 0 
for i in 0..100 
    amountOfDays += (i % 4) == 0 ? 366 : 365 
end 

而且,如果你想成爲一個有點習慣(這是非常罕見的使用for在紅寶石循環):

amount_of_days = (0..100).map { |year| year % 4 == 0 ? 366 : 365 }.reduce(:+) 
+1

雷納託,在你的最後一行,不需要'map';單獨使用'reduce'會更清潔和更快。 –

+1

我知道沒有必要,但我不同意它更清楚。我個人比較喜歡分離轉化價值的組合。 –

+0

謝謝雷納託。我覺得這個減少功能是一個奇怪的。我已經看到'inject(:+)'它將數組中的所有內容相加(非常好),在這種情況下'reduce(:+)'也會添加這些值? /編輯我看到他們是同一件事。 :-)問題(2):你能解釋一下在Arup的方式中,reduce如何處理兩個參數:number_of_days =(0..100).reduce(0){| tot,i | tot +((i%4 == 0)?366:365)}'? –

3

因爲您定義了amountOfDays = 0而不是,amountOfdays = 0。兩者都是不同的變量。可能是Typo。在所有情況下使用這些中的任何一個。

amountOfdays = 0 
for i in 0..100 
    (i % 4 == 0) ? amountOfdays += 366 : amountOfdays += 365 
end 

正確的命名將在Ruby中 - amount_of_days代替amountOfdays。或語法上更多的聲音number_of_days

更Ruby的方式 -

number_of_days = (0..100).reduce(0) { |tot,i| tot + ((i%4 == 0) ? 366 : 365) } 
#=> 36891 
+1

Jeez這花了我一些時間:=)我對Ruby有些新鮮,並習慣於使用IDE的靜態類型化語言。崇高的文字不給紅色捲曲的東西。謝謝一堆! –

+0

非常感謝命名約定和「更多Ruby方式」 - 更優雅的方式! –

+0

@ user2609980謝謝.. –