2013-12-22 134 views
-2

聽起來有點愚蠢。但我正在嘗試使用yield關鍵字來創建自定義循環。自定義日期範圍調查員

DateRange.new('2013-12-1', '2013-12-31').between do |date| 
    puts date 
end 

應導致

2013-12-1 
2013-12-2 
... 

DATERANGE類看起來像

class DateRange 
    attr_accessor :start_date, :end_date 

    def initialize(start_date, end_date) 
    @start_date = Date.parse(start_date.to_s) 
    @end_date = Date.parse(end_date.to_s) 
    end 

    def between(&block) 
    yield (start_date..end_date) 
    end  
end 

問題是自定義塊遍歷date_range

+0

你的問題是什麼? – sawa

+0

問題是使用自定義塊迭代date_range。 – swapab

+1

下來選民請支持與評論 – swapab

回答

2

使用Range#each迭代Range對象,併產生每個項目。

require 'date' 

class DateRange 
    attr_accessor :start_date, :end_date 

    def initialize(start_date, end_date) 
    @start_date = Date.parse(start_date.to_s) 
    @end_date = Date.parse(end_date.to_s) 
    end 

    def between(&block) 
    (start_date..end_date).each { |x| 
     yield x 
    } 

    # OR 
    # (start_date..end_date).each &block   
    end  
end 


DateRange.new('2013-12-1', '2013-12-31').between do |date| 
    puts date 
end 

順便提一下,DateRange.new的第二個參數應該是String。 2013-12-311970

+0

謝謝我最終抓住了我的大腦去解決它 – swapab

+0

This SO post幫助我http://stackoverflow.com/questions/16343103/how-do-i-write-my-own-loop-until – swapab

0

我能夠跟這樣做

def between(&block) 
    (start_date..end_date).map do |date| 
    yield date 
    end 
end 
+0

使用'Range#map',您實際上創建了一個'Array'的多餘實例,其中的值來自'Range'。你一定要在這裏使用'Range#each'迭代。 – mudasobwa

+0

@mudasobwa明白了你的觀點。謝謝! – swapab