class vs Class.new,module vs Module.new

时间:2013-12-20 09:40:40

标签: ruby

classClass.new之间有什么区别? moduleModule.new

我知道:

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

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

  3. Class.new返回objectclass A返回nil。同样适用于module s。

  4. 我错过了什么吗?

2 个答案:

答案 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

关键字moduleModule::new也是如此。

答案 1 :(得分:1)

  

Class.new会返回objectclass A返回nil。同样适用于module s。

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

class Foo
  42
end
# => 42

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

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

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