我想添加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
。
我怎樣才能使它工作?
我想添加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
。
我怎樣才能使它工作?
有一個在你的代碼一個錯字。在頂部設置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)
表達式,因爲它返回一個布爾值,但它返回一個數字。在紅寶石中,除false
和nil
之外的所有內容都會評估爲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(:+)
雷納託,在你的最後一行,不需要'map';單獨使用'reduce'會更清潔和更快。 –
我知道沒有必要,但我不同意它更清楚。我個人比較喜歡分離轉化價值的組合。 –
謝謝雷納託。我覺得這個減少功能是一個奇怪的。我已經看到'inject(:+)'它將數組中的所有內容相加(非常好),在這種情況下'reduce(:+)'也會添加這些值? /編輯我看到他們是同一件事。 :-)問題(2):你能解釋一下在Arup的方式中,reduce如何處理兩個參數:number_of_days =(0..100).reduce(0){| tot,i | tot +((i%4 == 0)?366:365)}'? –
因爲您定義了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
Jeez這花了我一些時間:=)我對Ruby有些新鮮,並習慣於使用IDE的靜態類型化語言。崇高的文字不給紅色捲曲的東西。謝謝一堆! –
非常感謝命名約定和「更多Ruby方式」 - 更優雅的方式! –
@ user2609980謝謝.. –
我認爲你的意思是「和365如果不是」。 – Addison
@addison True .. –