Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么不';是否为内置类的子类检查中列出的t实例变量?_Ruby_Inheritance_Subclass - Fatal编程技术网

Ruby 为什么不';是否为内置类的子类检查中列出的t实例变量?

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

当我将内置类划分为子类时,为什么inspect中的行为会发生变化。但当我对自定义的子类化时,却看不到

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
)。。。