ruby-on-rails - 在 ruby​​ 中映射范围

标签 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} 

最佳答案

目前(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/

相关文章:

ruby-on-rails - 使用连接的 Ruby on Rails ActiveRecord 查询

ruby-on-rails - Rails 3 上嵌套路由的功能测试

ruby-on-rails - 无法更改 spree 3.0 上的货币符号

ruby - ruby 1.9.2 的新正则表达式引擎 (Oniguruma) 很慢吗?

可以将二进制文件中的字符串替换为不同但长度相同的字符串的 Ruby 脚本?

ruby-on-rails - Rails 3 简单的 AJAX 删除不起作用,因为 authenticity_token 没有随请求一起发送

javascript - Rails 应用程序中 native HTML 需要图像路径

ruby - 在 rails 中创建对象及其所有关联模型的副本

ruby-on-rails - rails sqlite 适配器错误

windows - 在 Windows 上用 ruby​​ 编译 openssl