我可以使用带有class
关键字的常量名称创建一个类:
class MyClass1; end
我还可以创建一个类Class.new
并将其分配给常量或变量:
MyClass2 = Class.new do; end
myClass3 = Class.new do; end
但我无法使用class
名称以小写开头的关键字创建类:
class myclass4; end # => Error
这四个有根本区别吗?不是myclass3
普通班吗?
我可以使用带有class
关键字的常量名称创建一个类:
class MyClass1; end
我还可以创建一个类Class.new
并将其分配给常量或变量:
MyClass2 = Class.new do; end
myClass3 = Class.new do; end
但我无法使用class
名称以小写开头的关键字创建类:
class myclass4; end # => Error
这四个有根本区别吗?不是myclass3
普通班吗?
类似于安德鲁马歇尔的答案,但也不同。
这样想:
class Foo ...
语法不仅仅是定义一个类;除了定义一个类,第一次调用的时候一定要给它命名,并且类名必须是常量。请注意,原则上,一个类可以是无名的(参见#3)。
另一方面,可以对变量或常量进行赋值。对此没有任何限制。
创建类的更纯粹的方法是使用Class.new
. 使用此语法,您不必命名它。所以可以把它赋值给一个变量:
foo = Class.new
# => #<Class:0x007f36b23159a8>
只有当它第一次被分配给一个常量时,它才会被命名:
Foo = foo
# => Foo
第一个方法 ( class MyClass; end
) 是语言语法的显式部分(其中class
是关键字),并且类的名称必须是常量。
第二个方法 ( Class.new
) 只是一个普通的方法调用,它返回一个 Class 的匿名实例。然后可以像对待任何其他对象一样对待这个匿名实例。
除此之外,这两种方法之间没有区别。请注意,您仍然可以将第一种类型分配给非常量,但也必须首先将其分配给常量:
class MyClass; end
my_class = MyClass