将Ruby字符串范围转换为Range对象的最佳方法

Chr*_*yer 21 ruby

我有一些Ruby代码,它以格式在命令行上显示日期:

-d 20080101,20080201..20080229,20080301

这意味着我要为出现在列表中的其他日期20080201和20080229(含)之间的所有日期和运行.

鉴于我能得到的字符串20080201..20080229什么是将此转换为范围的情况下的最佳途径.目前我正在使用eval,但感觉应该有更好的方法.

@Purfideas我是种寻找一种更普遍的答案类型int..int的任何字符串转换为一个范围,我猜.

uji*_*fgc 35

Range.new(*self.split("..").map(&:to_i))
Run Code Online (Sandbox Code Playgroud)


Pur*_*eas 14

但那就是做

ends = '20080201..20080229'.split('..').map{|d| Integer(d)}
ends[0]..ends[1]
Run Code Online (Sandbox Code Playgroud)

无论如何,出于安全考虑,我不建议使用eval


the*_*zer 7

没有args的注入适用于两个元素数组:

rng='20080201..20080229'.split('..').inject { |s,e| s.to_i..e.to_i }
Run Code Online (Sandbox Code Playgroud)

当然,这可以是通用的

class Range
  def self.from_ary(a)
    a.inject{|s,e| s..e }
  end
end

rng = Range.from_ary('20080201..20080229'.split('..').map{|s| s.to_i})
rng.class  # => Range
Run Code Online (Sandbox Code Playgroud)