我遇到了一个关于 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?
当您查看 Ruby 类的源代码时,您将看到该类String定义了 method ,该方法在分配新实例String#initialize之后调用String#new(继承自)。Object您不会在新实例中调用String#initialize(或),因此在检查新创建的对象时会得到。#super""
BigDecimal定义 method Bigdecimal#new,它分配自己的对象。对象创建由两部分组成——为新对象分配空间并初始化它。您只定义了初始化新对象,因此您保留为对象分配默认空间。如果您想覆盖它,您应该#new在新类中定义并使用适当的BigDecimal参数调用#new。
希望这能澄清你的示例中发生的情况。
| 归档时间: |
|
| 查看次数: |
3675 次 |
| 最近记录: |