class vs Class.new,module vs Module.new
class
和Class.new
& module
和Module.new
什么Module.new
?
我知道:
-
Class.new
/Module.new
创建一个匿名class
/module
。 当我们第一次将它分配给常量时,它将成为class
/module
名称。class
/module
自动执行此操作。 -
当我们想要inheritance时,我们可以传递一个参数:
Class.new(ancestor)
。 当我们没有指定祖先时,它被设置为Object
。class
使用以下语法:class A < Ancestor
-
Class.new
返回一个object
。class A
返回nil
。module
。
我错过了什么?
你在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
关键字module
和Module::new
有同样的区别。
Class.new
返回一个object
。class A
返回nil
。module
。
那是错的。 类/模块定义返回在类/模块体内部计算的最后一个表达式的值:
class Foo 42 end # => 42
通常,在类/模块体内部计算的最后一个表达式将是一个方法定义表达式,在当前版本的Ruby中返回一个表示方法名称的Symbol
:
class Foo def bar; end end # => :bar
在早期版本的Ruby中,方法定义表达式的返回值是实现定义的。 Rubinius为相关方法返回了一个CompiledMethod
对象,而YARV和其他大多数人只返回了nil
。