Ruby匿名类创建疑问:大写C对应的类是否属于匿名类
结论
你的判断完全正确,匿名类的本质是「没有绑定大写常量的类对象」,这和《The Well-Grounded Rubyist》中的相关表述完全一致。
具体说明
- 调用
Class.new创建类时,如果仅赋值给小写开头的局部变量(比如示例中的c),类对象没有对应的公开常量名称,就属于匿名类,在irb中输出时只会显示内存地址,格式为#<Class:0x...>,和你给出的第一个示例的输出完全吻合。 - 当你把同一个类对象赋值给大写开头的常量(比如示例中的
C)时,Ruby会自动将常量名设置为该类的官方名称,此时这个类就不再是匿名类了,输出类本身、类的实例时都会直接显示常量名C而非内存地址。
你可以用下面的代码验证这个逻辑:
# 仅赋值给局部变量,为匿名类 c = Class.new p c # 输出类似 #<Class:0x0000000106b87d90> 的内容 # 赋值给大写常量后自动获得名称,不再是匿名类 C = c p c # 输出 C p C.new.class # 输出 C
《The Well-Grounded Rubyist》原文相关表述:类的名称本质上就是绑定到该类对象的大写常量名,只有没有绑定任何大写常量的类才属于匿名类。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

