定期创建类和使用Class.new之间的区别

时间:2013-07-07 15:14:12

标签: ruby

我可以使用class关键字的常量名称创建一个类:

class MyClass1; end

我还可以使用Class.new创建一个类,并将其分配给常量或变量:

MyClass2 = Class.new do; end
myClass3 = Class.new do; end

但我不能使用名称以小写字母开头的class关键字创建一个类:

class myclass4; end # => Error

这四个之间有根本区别吗? myclass3不是普通班级吗?

2 个答案:

答案 0 :(得分:1)

  • 第一种方法(class MyClass; end)是语言语法的明确部分(class是关键字),类的名称必须是常量。

  • 第二种方法(Class.new)只是一种普通的方法调用,并返回一个Class的匿名实例。然后可以像处理任何其他对象一样处理此匿名实例。

除此之外,两种方法之间没有区别。请注意,您仍然可以将第一种类型指定为非常量,但也必须先将其指定为常量:

class MyClass; end
my_class = MyClass

答案 1 :(得分:1)

类似于Andrew Marshall的回答,但也有所不同。


这样想:

  1. class Foo ...语法不只是定义一个类;除了定义一个类之外,它必须在第一次调用时命名它,并且类名必须是常量。请注意,原则上,类可以是无名的(参见#3)。

  2. 另一方面,可以对变量或常量进行赋值。对此没有限制。

  3. 创建类的更简单方法是使用Class.new。使用此语法,您不必为其命名。所以可以将它分配给变量:

    foo = Class.new
    # => #<Class:0x007f36b23159a8>
    

    只有在第一次将其分配给常量时才会命名为:

    Foo = foo
    # => Foo