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