class vs Class.new,module vs Module.new

classClass.newmoduleModule.new什么Module.new

我知道:

  1. Class.new / Module.new创建一个匿名class / module 。 当我们第一次将它分配给常量时,它将成为class / module名称。 class / module自动执行此操作。

  2. 当我们想要inheritance时,我们可以传递一个参数: Class.new(ancestor) 。 当我们没有指定祖先时,它被设置为Objectclass使用以下语法: class A < Ancestor

  3. Class.new返回一个objectclass A返回nilmodule

我错过了什么?

你在class关键字和Class::new之间错过的有趣点是 – Class::new接受块。 因此,当您使用Class::new创建类对象时,您还可以访问周围的变量。 因为封闭的 。 但是,当您使用关键字class创建类时,这是不可能的。 因为class创造了一个不了解外部世界的全新范围​​。 让我举几个例子。

这里我使用关键字class创建一个class

 count = 2 class Foo puts count end # undefined local variable or method `count' for Foo:Class (NameError) 

这里使用Class.new

 count = 2 Foo = Class.new do |c| puts count end # >> 2 

关键字moduleModule::new有同样的区别。

Class.new返回一个objectclass A返回nilmodule

那是错的。 类/模块定义返回在类/模块体内部计算的最后一个表达式的值:

 class Foo 42 end # => 42 

通常,在类/模块体内部计算的最后一个表达式将是一个方法定义表达式,在当前版本的Ruby中返回一个表示方法名称的Symbol

 class Foo def bar; end end # => :bar 

在早期版本的Ruby中,方法定义表达式的返回值是实现定义的。 Rubinius为相关方法返回了一个CompiledMethod对象,而YARV和其他大多数人只返回了nil