gpt4 book ai didi

ruby - rspec 中定义的匿名类不会响应新的

转载 作者:数据小太阳 更新时间:2023-10-29 08:25:55 25 4
gpt4 key购买 nike

所以我有以下匿名类定义:

  let!(:fake_class) do
Class.new(Integer) do
def initialize(value)
@value = value
end

def ==(other)
@value == other
end

def coerce(other)
[@value, other]
end

def to_s
@value.to_s
end
end
end

但是当我这样做的时候:

fake_class.new 4

我刚得到 undefined method 'new' for #<Class:0x00007fc065377c88>

我试过

define_method :initialize do |value|
@value = value
end

没有区别

它响应新消息的唯一方式是如果我这样做

class << self
def new(value)
@value = value
end
end

但这显然行不通,因为我需要它像真正的类一样行事。

为什么我看到很多使用 intialize 的教程它按预期工作但它似乎不适合我?是因为我在 rspec 或其他东西中定义它吗?

最佳答案

这里的问题与 rspec 无关,也与匿名类无关。

问题是在 ruby​​ 中,你不能继承 Integer*。

Ruby 将小的 Integer(以前称为 Fixnum)存储为立即值,使用单词的一些低位来标记它,而不是指向堆上对象的指针。因此,您不能向 Integer 的单个“实例”添加方法,也不能对其进行子类化。

如果您真的想要一个“类整数”类,您可以使用具有整数实例变量的类构造一个变通方法,并适本地转发方法调用:

class FakeInteger
def initialize(integer)
@integer = integer
end

def method_missing(name, *args, &blk)
ret = @integer.send(name, *args, &blk)
ret.is_a?(Numeric) ? FakeInteger.new(ret) : ret
end
end

* 技术上你可以,但是因为你不能从它实例化任何对象,所以它很没用:)

关于ruby - rspec 中定义的匿名类不会响应新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50390448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com