讓我們通過代碼行由行。我會解釋發生了什麼,並說明如何改進。
puts 'Input a starting year:'
start_year = gets.chomp
這將是使start_year
整數更方便,所以我們不必保持一個字符串和一個整數之間的轉換。因此,我們應該在第二行改爲
start_year = gets.to_i
如果您檢查文檔爲String#to_i,你會看到,這是一樣的
start_year = gets.chomp.to_i
接下來,
puts 'Input an ending year:'
end_year = gets.to_i
puts ''
while start_year <= end_year
最後一行要求Ruby繼續while
循環,只要start_year <= end_year
是true
。當這個表達式變成false
(當start_year == end_year + 1
)時,她退出循環。注意這一行和下面的行簡化。
if start_year % 400 == 0
puts start_year
如果年份可以被400
整除,那麼這是一個閏年。
elsif start_year % 100 == 0
如果年份是100
整除,而不是由400
,它是不是閏年,所以我們什麼也不做,轉到如果/ ELSIF /結束子句的結束和下一個執行start_year += 1
。
elsif start_year % 4 == 0
puts start_year
end
如果年份是4
整除,而不是由100
,是爲閏年。如果start_year % 4 != 0
這不是一個閏年,所以我們不打印它。
start_year += 1
其中Ruby擴展爲start_year = start_year + 1
。
end
返回到循環的頂部並重復。
更好
這裏的編寫,代碼轉換的方法,使用單個布爾表達式和打印方法(閏年的陣列)的返回值的更紅寶石狀方式。
def leap_years(start_year, end_year)
(start_year..end_year).select { |yr|
yr % 400 == 0 || (yr % 100 != 0 && yr % 4 == 0) }
end
puts 'Input a starting year:'
start_year = gets.to_i
puts 'Input an ending year:'
end_year = gets.to_i
p leap_years(start_year, end_year)
#=> [1904, 1908, 1912, 1916, 1920]
first_year..last_year
是一個範圍(類Range的一個實例)。 Range
包括模塊Enumerable
,它爲它提供了實例方法Enumerable#select。
最佳
下將獲得兩個給定年間的閏年更簡單的方法,通過利用類方法Date::leap?的。
require 'date'
def leaps_between(first_year, last_year)
(first_year..last_year).select { |y| Date.leap?(y) }
end
leaps_between(2000, 2016)
#=> [2000, 2004, 2008, 2012, 2016]
leaps_between(1900, 1916)
#=> [1904, 1908, 1912, 1916]
Ruby有一個相當不錯的[documentation](http://ruby-doc.org/core)。你有沒有試圖自己查看方法? – Stefan
堆疊在@Stefan所說的內容上。我會查找循環方法和Ruby運算符來弄清楚這個代碼是如何工作的。 – Antonio