在ruby中对Fixnum进行子类化

clo*_*ead 7 ruby inheritance

所以我理解你不应该直接将Fixnum,Float或Integer子类化,因为它们没有#new方法.使用DelegateClass似乎工作,但它是最好的方法吗?有谁知道这些课没有#new背后的原因是什么?

我需要一个类似Fixnum的类,但有一些额外的方法,我希望能够self从类中引用它的值,例如:

class Foo < Fixnum
  def initialize value
    super value
  end

  def increment
    self + 1
  end
end

Foo.new(5).increment + 4 # => 10
Run Code Online (Sandbox Code Playgroud)

Yeh*_*atz 17

您可以自己轻松地设置快速转发实现:

class MyNum
  def initialize(number)
    @number = number
  end

  def method_missing(name, *args, &blk)
    ret = @number.send(name, *args, &blk)
    ret.is_a?(Numeric) ? MyNum.new(ret) : ret
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以在MyNum上添加你想要的任何方法,但是你需要在这些方法中使用@number,而不是直接调用super.