所以我知道你不应该直接子类化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发布于 2009-07-08 03:23:07
您可以很容易地自己设置一个快速转发实现:
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进行操作,而不是直接调用超级。
发布于 2009-07-08 02:26:57
IIRC,Ruby的主要实现将Fixnums存储为立即值,使用字的一些低位将其标记为Fixnum,而不是指向堆上对象的指针。这就是为什么在32位机器上,Fixnums只有29位(或其他任何值),而不是一个完整的字。
因此,您不能将方法添加到Fixnum的单个“实例”中,也不能将其子类化。
如果您一心想要拥有一个“类似Fixnum”的类,那么您可能必须创建一个具有Fixnum实例变量的类,并适当地转发方法调用。
发布于 2009-07-08 02:16:47
你能不能不扩展FixNum本身?比如..。
class Fixnum
def even?
self % 2 == 0
end
end
42.even?https://stackoverflow.com/questions/1095789
复制相似问题