class
和Class.new
之间有什么区别? module
和Module.new
?
我知道:
Class.new
/ Module.new
创建匿名class
/ module
。当我们第一次将其分配为常量时,它将成为class
/ module
的名称。 class
/ module
会自动执行此操作。
当我们想要继承时,我们可以传递一个参数:Class.new(ancestor)
。当我们没有指定祖先时,它被设置为Object
。 class
使用以下语法:class A < Ancestor
Class.new
返回object
。 class A
返回nil
。同样适用于module
s。
我错过了什么吗?
答案 0 :(得分:8)
class
关键字与Class::new
之间错过的有趣点是 - Class::new
接受阻止。因此,当您使用Class::new
创建类对象时,您还可以访问周围的变量。因为块是闭包。但是,当您使用关键字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
也是如此。
答案 1 :(得分:1)
Class.new
会返回object
。class A
返回nil
。同样适用于module
s。
那是错的。类/模块定义返回在类/模块体内部计算的最后一个表达式的值:
class Foo
42
end
# => 42
通常,在类/模块体内部计算的最后一个表达式将是一个方法定义表达式,在当前版本的Ruby中返回一个Symbol
表示方法的名称:
class Foo
def bar; end
end
# => :bar
在旧版本的Ruby中,方法定义表达式的返回值是实现定义的。 Rubinius为相关方法返回了一个CompiledMethod
对象,而YARV和其他大多数人只返回了nil
。