是否有一种简单的方法可以在不遍历整个范围的情况下将范围映射到 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}
最佳答案
目前(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 }
显然, block 必须产生适合创建范围的值。
关于ruby-on-rails - 在 ruby 中映射范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30099197/