我正在尝试一些关于如何在内部声明类以及声明类时会发生什么的代码。我知道,当声明一个类时,会创建一个“类”对象,并创建一个具有声明类名称的常量。例如
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'是一个类。我很困惑原因
class x
def say_hi
'hi'
end
end
给
SyntaxError: (irb):121: class/module name must be CONSTANT
为什么会这样?
- -更新 - -
我试过了
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
因为它允许我创建新对象。if x
would have been an instance thennew
会因错误而失败。
我的问题是,为什么 ruby 允许我以特定方式声明一个类?如果它不是一个类,那么它为什么表现得像一个类?