2013-12-22 55 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