class vs Class.new,模块 vs Module.new [英] class vs Class.new, module vs Module.new

查看:36
本文介绍了class vs Class.new,模块 vs Module.new的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

classClass.new 有什么区别 &moduleModule.new?

What is difference between class and Class.new & module and Module.new?

我知道:

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

  1. Class.new/Module.new create an anonymous class/module. When we assign it to constant for the first time it becomes name of that class/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 modules.

我错过了什么吗?

推荐答案

您在 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

相同的区别在于关键字 moduleModule::new.

The same difference goes with keyword module and Module::new.

这篇关于class vs Class.new,模块 vs Module.new的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆