Ruby 为什么不';是否为内置类的子类检查中列出的t实例变量?
当我将内置类划分为子类时,为什么inspect中的行为会发生变化。但当我对自定义的子类化时,却看不到Ruby 为什么不';是否为内置类的子类检查中列出的t实例变量?,ruby,inheritance,subclass,Ruby,Inheritance,Subclass,当我将内置类划分为子类时,为什么inspect中的行为会发生变化。但当我对自定义的子类化时,却看不到 class MainError end class AnotherTestError < StandardError def initialize @label_test = "hey!" end end class TestError < MainError def initialize @label_test = "hey!" end end
class MainError
end
class AnotherTestError < StandardError
def initialize
@label_test = "hey!"
end
end
class TestError < MainError
def initialize
@label_test = "hey!"
end
end
a = AnotherTestError.new
puts a.inspect # output: #<AnotherTestError: AnotherTestError>
t = TestError.new
puts t.inspect # output: #<TestError:0x007f99e12409f0 @label_test="hey!">
class主错误
结束
另一类测试仪错误<标准错误
def初始化
@label_test=“嘿!”
结束
结束
类测试器错误
因为许多(大多数?全部?)内置类
- 都是用C写的,并且
- 覆盖
#检查
StandardError
的超类定义了#inspect
,如下所示:
exc\u检查(值exc)
{
价值str,klass;
klass=类别(exc);
exc=rb_obj_as_字符串(exc);
if(RSTRING_LEN(exc)==0){
返回rb_str_dup(rb_class_name(klass));
}
str=rb_str_buf_new2(“#”,1);
返回str;
}
有趣的部分是构建返回字符串
另一方面,定义了:
静态值
rb_obj_检查(值obj)
{
如果(rb_ivar_计数(obj)>0){
价值链;
值c=rb_类名称(类(obj));
str=rb_sprintf(“-非常好的问题!+1是..它已被重写。事实上,“重写”是我缺少的单词。感谢:-)检查它的定义位置:StandardError.instance_方法(:inspect).owner#=>异常
但我不明白为什么会重写它?我猜stacktrace在这种形式下显示起来有点像野兽。此外,如果您需要处理异常(子)类,您的代码已经在rescue
块中,应该正确处理异常(即,将e.message
和e.backtrace
记录到日志文件/$stderr
,而不仅仅是将e.inspect
打印到$stdout
)。。。