class vs Class.new,模块 vs Module.new [英] class vs Class.new, module vs Module.new
问题描述
class
和 Class.new
有什么区别 &module
和 Module.new
?
What is difference between class
and Class.new
& module
and Module.new
?
我知道:
Class.new
/Module.new
创建一个匿名的class
/module
.当我们第一次将它分配给常量时,它成为那个class
/module
的名称.class
/module
自动执行此操作.
Class.new
/Module.new
create an anonymousclass
/module
. When we assign it to constant for the first time it becomes name of thatclass
/module
.class
/module
do this automatically.
当我们想要继承时,我们可以传递一个参数:Class.new(ancestor)
.当我们不指定祖先时,它被设置为 Object
.class
使用以下语法:class A <祖先
When we want to inherit, we can pass an argument: Class.new(ancestor)
. When we don't specify an ancestor, it is set to the Object
. class
use this syntax: class A < Ancestor
Class.new
返回一个 object
.class A
返回 nil
.module
也是如此.
Class.new
returns an object
. class A
returns nil
. Same goes for module
s.
我错过了什么吗?
推荐答案
您在 class
关键字和 Class::new
是 - Class::new
接受块.因此,当您使用 Class::new
创建类对象时,您还可以访问周围的变量.因为block就是closure.但这是不可能的,当您将使用关键字 class
创建一个类时.因为 class
创建了一个全新的作用域,它对外部世界一无所知.让我给你举几个例子.
The interesting point that you missed between class
keyword and Class::new
is - Class::new
accepts block. So when you will be creating a class object using Class::new
you can also access to the surrounding variables. Because block is closure. But this is not possible, when you will be creating a class using the keyword class
. Because class
creates a brand new scope which has no knowledge about the outside world. Let me give you some examples.
这里我使用关键字 class
创建一个类:
Here I am creating a class using keyword 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
.
The same difference goes with keyword module
and Module::new
.
这篇关于class vs Class.new,模块 vs Module.new的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!