ruby中Fixnum的子分类

ruby中Fixnum的子分类,ruby,inheritance,Ruby,Inheritance,因此,我理解您不应该直接将Fixnum、Float或Integer子类化,因为它们没有新的方法。虽然使用DelegateClass似乎有效,但这是最好的方法吗?有人知道这些课程没有新课程的原因是什么吗 我需要一个行为类似Fixnum的类,但有一些额外的方法,我希望能够通过类内的self引用其值,例如: class Foo < Fixnum def initialize value super value end def increment self + 1

因此,我理解您不应该直接将Fixnum、Float或Integer子类化,因为它们没有新的方法。虽然使用DelegateClass似乎有效,但这是最好的方法吗?有人知道这些课程没有新课程的原因是什么吗

我需要一个行为类似Fixnum的类,但有一些额外的方法,我希望能够通过类内的
self
引用其值,例如:

class Foo < Fixnum
  def initialize value
    super value
  end

  def increment
    self + 1
  end
end

Foo.new(5).increment + 4 # => 10
class Foo10

您不能扩展FixNum本身吗?像

class Fixnum
  def even?
    self % 2 == 0
  end
end

42.even?

Ruby的主要实现IIRC将Fixnum存储为立即值,使用单词的一些低位将其标记为Fixnum,而不是指向堆上对象的指针。这就是为什么在32位机器上,fixmums只有29位(或其他什么),而不是一个完整的字

因此,不能将方法添加到Fixnum的单个“实例”中,也不能将其子类化


如果你死心塌地想要一个“Fixnum-like”类,你可能需要创建一个具有Fixnum实例变量的类,并适当地转发方法调用。

你可以很容易地自己设置一个快速转发实现:

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

然后,您可以在MyNum上添加您想要的任何方法,但您需要在这些方法中对@number进行操作,而不是直接调用超级函数。

告诉我们您真正想做什么(最终目标),我们将尝试告诉您最好的方法。我认为分类在这里不合适。我可以,但我不想。此外,Fixnum没有#new,我需要能够向#initialize添加功能。应小心使用Monkey-patching。仅仅为了一个特定的用例而污染一个Ruby核心类可能是危险的。有没有其他类可以作为子类?Numeric有一个#new,但它不接受任何参数,所以我想它是一个抽象类。我已经有一段时间没有接触Ruby了,我也不记得数值类树是如何布局的。唯一明显的候选对象是BigDecimal。向FixNum的单个实例添加实例方法的一种解决方法:class FixNum;def-fun;to_.s.to_sym==:'37'?'乐趣:超级;结束;嗯。但是,如果您使用了MyNum.new(2)+MyNum.new(3),您不会得到一个Fixnum而不是一个MyNum实例吗?我想你需要包装@number.send in MyNum.newI更新了我的答案,以确保如果原始响应是数字,你会返回一个MyNum。MyNum是否可以实现为MyNum.new(5)==5和5==MyNum.new(5)?