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

Ric*_*ang 6 ruby

我遇到了一个关于 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
Run Code Online (Sandbox Code Playgroud)

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

MBO*_*MBO 2

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

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

希望这能澄清你的示例中发生的情况。