映射红宝石范围

菲利普·科雷亚(Filipe Correia)

是否有一种简单的方法可以将范围映射到红宝石中的另一种范围,而无需遍历整个范围?基本上我想要达到的是

## 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} 
undur_gongor

当前(Ruby 2.2.2)没有比这更好的方法了

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

如果查看Range文档,您会发现没有一种方法可以直接实现类似的功能。

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

您可以自己猴子打补丁,例如:

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 }

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章