Ruby构造函数继承问题:继承Symbol类无法创建构造函数的机制是什么?
解答
- 你看到的
Syb.respond_to? :new返回false,核心原因是**Symbol类本身就把继承自父类Class的new类方法重写为了私有方法**,这个特性会默认被子类继承。而respond_to?默认只查询公共类/实例方法,自然返回false。你可以执行Symbol.private_methods.include?(:new)验证,会得到true的结果。 - 就算你强行用
Syb.send(:new)绕过私有方法限制调用,也会抛出TypeError: allocator undefined for Syb错误。这是Ruby虚拟机层的限制:Symbol和Integer、Float这类值类型都属于即时值(immediate value),是全局唯一、不可变的,Ruby VM没有给这类类型的自定义子类开放实例内存分配器,不允许用户自行创建这类类型的实例。 - 没有额外的“唯一性标识”控制子类的唯一性,Symbol的全局唯一性完全由VM内部的全局Symbol表保证:每次创建新Symbol前都会查表,已有同名字符串对应的Symbol就直接返回已有引用,不存在才会新建,自定义子类也绕不开这层VM校验,自然也继承了全局唯一性的特性。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

