gpt4 book ai didi

ruby - 关于覆盖初始化方法的问题

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

我遇到了一个关于 override initialize message of BigDecimal 的奇怪问题。

class Test1 < String
def initialize(a, b)
puts a
puts b
end
end

require 'bigdecimal'
class Test2 < BigDecimal
def initialize(a, b)
puts a
puts b
end
end

>> Test1.new('a', 'b')
a
b
>> Test2.new('a', 'b')
TypeError: wrong argument type String (expected Fixnum)
from (irb):17:in `new'
from (irb):17

为什么我可以覆盖String的初始化消息,但不能覆盖BigDecimal?

最佳答案

当您查看 Ruby 类的源代码时,您会看到 String 类定义了方法 String#initialize,该方法在 String#new 之后调用(继承自 Object)用于分配新实例。您没有在新实例中调用 String#initialize(或 #super),因此在检查新创建的对象时得到了 "" .

BigDecimal 定义方法 Bigdecimal#new,它分配自己的对象。对象创建包括两部分——为新对象分配空间和初始化它。您只定义了初始化新对象,因此您保留默认为对象分配空间。如果您想覆盖它,您应该在新类中定义 #new 并使用适当的参数调用 BigDecimal#new

希望这能稍微澄清您的示例中发生的事情。

关于ruby - 关于覆盖初始化方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1818518/

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