我在尝试一些关于如何在内部声明类以及声明类时会发生什么的代码。我得知,当一个类被声明时,一个'Class'对象被创建并且一个常量与被声明的类的名字被创建。例如ruby对象模型和类声明
MyClass = Class.new
MyClass.class => Class
MyClass.superclass => Object
Class.constants.include? :MyClass => true
我也尝试
x = Class.new => #<Class:0xd886938>
x.class => Class
x.superclass => Object
Class.constants.include? :x => false #why so???
这意味着 'X' 是一个类。 I M困惑的原因
class x
def say_hi
'hi'
end
end
给
SyntaxError: (irb):121: class/module name must be CONSTANT
为什么会出现这种情况?
--- UPDATE ---
我试图
def x.x_method
'x class method'
end
,做
x.methods.include? :x_method => true
同样
x.singleton_methods.include? :x_method => true
主要
x.methods - MyClass.methods => [:x_method]
上面一行指出x
是一个类,因为它是类Class
的一个对象。由于所有用户定义的类是Class
类的对象,则它们的初始方法也应该是相同的,除非一些单方法被声明为一个特定的类(在上述情况下x
具有单方法)
x => #<Class:0xd886938>
obj_x = x.new => #<#<Class:0xd886938>:0xd30caac>
obj_x.class => #<Class:0xd886938>
上面代码进一步加强了x
是一个类,因为它允许我创建新的对象。如果x
本来是一个实例,那么new
将失败并出现错误。
我的问题是,为什么红宝石允许我以特定的方式声明一个类?如果它不是一个类,那它为什么表现得像一个?
@mbratch但一切都是红宝石是一个对象。即Class类的一个实例。比如说,String类是Class类的一个实例。 –
x是对一个类的引用。你不能从它的名字访问这个类,因为它没有它,因为ruby期望所有的类名都是常量,而你没有提供它。因此'SyntaxError:(irb):121:class/module name必须是CONSTANT'错误。你可以访问你创建的这个类的唯一方法就是你存储在x中的这个引用。 – Cezar
尝试下面的命令,看看它们与'x'有什么不同。而不是以#的形式查看对任意未命名类的引用,这是'x'引用的内容,您将看到类名。 'obj_MyClass = MyClass.new'和'obj_MyClass.class' –
Cezar