Ruby 如何重新定义 1..5 这个..方法?

sevk · 2013年10月22日 · 最后由 song940 回复于 2013年10月23日 · 3025 次阅读

我想重新定义 .. 方法

class Fixnum
  alias _a_ ..
  def .. i
    if self > i
      x = i._a_  self
      x.to_a.reverse #返回Array
    else
      self._a_  i
    end
  end
end

a = 1..5 ; p a.to_a
a = 5..1 ; p a.to_a

这样写不对,求指教 ,多谢

这是语法,不是方法

#1 楼 @jjym 如何区分哪些是语法,哪些是方法?求文档

查了一下,好像无法定义.....,但是可以定义 Range,当然,可能不是你要的。。

class Range
    alias_method :orig_init, :initialize
    def initialize(b, e, *args)
        orig_init(b * 10, e * 10, *args)
    end
end

Range.new(1, 2) #=> 10..20

1..2 #=> 1..2

#2 楼 @sevk ..码农的直觉

#4 楼 @ericguo 嗯,多谢

加号可以重定义,就是点点不行。

运算符 一般都可以重定义 , 但是 .. 这东西应该是类似 "string" 5 这种的字面值常量 , 就像:

"hi" -> new String("hi") 5 -> new Int32(5) 1..5 -> new Range(1,5)

所以可能不能重写~ (码农瞎猜 :P )

需要 登录 后方可回复, 如果你还没有账号请 注册新账号