用ruby映射范围

时间:2015-05-07 11:01:47

标签: ruby-on-rails ruby

是否有一种简单的方法可以将范围映射到ruby中的另一种范围而不会遍历整个范围? 基本上我想要实现的是这个

## mapping this
range = 1..5
## into this
date_range = (1.year.ago)..(5.years.ago)

我想出的最好的是:

(range.begin.years.ago)..(range.end.years.ago)

是否有一种方法可以让我做类似的事情:

range.map {|e| e.years.ago} 

1 个答案:

答案 0 :(得分:4)

目前(Ruby 2.2.2)没有比

更好的方法了
(range.begin.years.ago)..(range.end.years.ago)

如果你查看documentation of Range,你会发现没有一种方法直接实现这样的东西。

然后,包含的模块Enumerable已经失去了范围语义(由第一个和最后一个元素定义)。

你可以自己修补它:

class Range
  def rmap(&b)
    Range.new(yield(self.begin), yield(self.end), exclude_end?)
  end 
end

然后执行(years.ago需要ActiveSupport / Rails):

(1..5).rmap { | a | a.years.ago }

显然,块必须产生适合创建范围的值。