首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby中的Fixnum子类

ruby中的Fixnum子类
EN

Stack Overflow用户
提问于 2009-07-08 01:57:42
回答 3查看 4.1K关注 0票数 7

所以我知道你不应该直接子类化Fixnum,Float或者Integer,因为他们没有#new方法。使用DelegateClass似乎是可行的,但这是最好的方法吗?有人知道这些类没有#new的原因是什么吗?

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

代码语言:javascript
复制
class Foo < Fixnum
  def initialize value
    super value
  end

  def increment
    self + 1
  end
end

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-08 03:23:07

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

代码语言:javascript
复制
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进行操作,而不是直接调用超级。

票数 17
EN

Stack Overflow用户

发布于 2009-07-08 02:26:57

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

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

如果您一心想要拥有一个“类似Fixnum”的类,那么您可能必须创建一个具有Fixnum实例变量的类,并适当地转发方法调用。

票数 4
EN

Stack Overflow用户

发布于 2009-07-08 02:16:47

你能不能不扩展FixNum本身?比如..。

代码语言:javascript
复制
class Fixnum
  def even?
    self % 2 == 0
  end
end

42.even?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1095789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档