2011-09-30 125 views
0

我正在嘗試構建幫助程序以從列表中選擇下一個可用日期。Ruby:日選擇程序(從列表中選擇下一個可用日期)

我有天名單作爲參考(這些都是我想要的東西發生當天)

class_list = ["Monday","Saturday","Sunday"] 

我需要檢查當天,在列表匹配。 如果它是列表的一部分,我選擇它,如果不是,我從列表中選擇下一個。

這是我到目前爲止有:

#select current day, get its name value and weekday number value 
today = Time.now 
today_name = today.strftime("%A") 
#not sure which of the 2 following line is better 
#today_index = DateTime.parse(today_name).wday 
today_index = today.strftime("%u").to_i 

那我匹配

if class_list.include? today_name 
    #victory!!! 
    puts today_name 
else 
    puts "find next day" 
    class_list.each do |x| 
    if DateTime.parse(x).wday > today_index 
     puts "result #{x}" 
     break 
    end 
    end 
end 

當我運行它似乎很好地工作,但我只是學習Ruby我」米總是想知道我是不是過分複雜的事情。

這個代碼對你來說看起來不錯Ruby主人?

回答

1
require 'date' 

def next_date_from(ar) 
    cur_day = Date.today 
    cur_day += 1 until ar.include?(cur_day.strftime('%A')) 
    cur_day 
end 

puts next_date_from(%w(Monday Saturday Sunday)) 
#=>2011-10-01 
+0

所以Ruby很聰明,明白當你給日期對象加1時,意味着第二天?我喜歡Date.today。在文檔中找不到它:( –

+1

[doc for Date.today](http://ruby-doc.org/stdlib/libdoc/date/rdoc/classes/Date.html#M000411)。Ruby也可以> > 1和<< 1(幾個月) – steenslag

1

我會更好地有一張地圖,一個給定的一天鏈接到以下一個和默認值,如果當天沒有找到:

days = {:Monday => :Tuesday, :Tuesday => :Wednesday ...} 
days.default = :Monday 

當你做天[星期一]你:週二 時你試圖得到一個不存在的條目,你會得到默認值。

+0

我真正想要做的就是每天切換,以便它顯示當前日期或下一個可用的列表中。我喜歡在日期選擇器不起作用的情況下可以實例化的默認狀態。但我需要不斷旋轉日子。 –

1

對於部分:

if class_list.include? today_name 
    #victory!!! 
    puts today_name 
else 
    puts "find next day" 
    class_list.each do |x| 
    if DateTime.parse(x).wday > today_index 
     puts "result #{x}" 
     break 
    end 
    end 
end 

你可以寫這樣的:

if class_list.include? today_name 
    #victory!!! 
    puts today_name 
else 
    puts "find next day" 
    result = class_list.find {|e| DateTime.parse(e).wday > today_index } 
    puts "result = #{result}" 
end 
+0

.find返回第一個結果? –

+1

是的。 '.select'找到所有匹配的條件。 – Geo

+0

非常好的一條信息:) –

相關問題