ruby中Fixnum的子分类
因此,我理解您不应该直接将Fixnum、Float或Integer子类化,因为它们没有新的方法。虽然使用DelegateClass似乎有效,但这是最好的方法吗?有人知道这些课程没有新课程的原因是什么吗 我需要一个行为类似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
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)?