2011-03-04 204 views
1

现在,下面的代码会在其下面生成输出,但是如何将默认输出覆盖为更符合我的情况的逻辑输出。我知道我可以在范围后追加字符串"Hz",但是我想将它合并到一个模块中,该模块可以在需要时包含到Range类中或与refinements一起使用。覆盖默认范围输出

代码:

("20Hz"..."40Hz").each { |hz| p hz }  

输出:

"20Hz" 
"20Ia" 
"20Ib" 
...etc 

通缉输出:

"20Hz" 
"21Hz" 
"22Hz" 
...etc 

回答

1

这绝对是一个坏主意,但只是为了实验的缘故:

class String 
    alias_method :succ_orig, :succ 

    def succ 
    self.gsub(/\d+/, &:succ_orig) 
    end 
end 

p ("20Hz".."40Hz").to_a 
#=> ["20Hz", "21Hz", "22Hz", "23Hz", "24Hz", "25Hz", "26Hz", "27Hz", "28Hz", "29Hz", "30Hz", "31Hz", "32Hz", "33Hz", "34Hz", "35Hz", "36Hz", "37Hz", "38Hz", "39Hz", "40Hz"] 

正如你所看到的,它不是Range类应该被改变,但是String#succ方法。

但是在实际项目中,您最好为您的Hertz字符串创建一个类并适当地定义它的succ方法。

+0

我们走了。顺便说一句,它唯一可以使用的时间将在DSL的某个块中,所以它不是一个好主意。 – RyanScottLewis 2011-03-04 09:03:21

1

我认为它很简单。

 
    ("20"..."40").each { |hz| p hz + 'Hz'} 
1

我会建议创建自己的函数或类,而不是改变Ruby范围的行为方式。可能有很多其他代码依赖于以特定方式工作的范围,并且更改范围定义会导致代码中断。您可能要瞄准的是这样的:

HzRange.new("20Hz", "40Hz").each{ |hz| p hz } 

的HzRange类的创建是你的,但你可能应该委托给数组或范围,对象,以便您可以继承像可枚举一些默认行为。