【问题标题】:class vs Class.new, module vs Module.new类 vs Class.new,模块 vs Module.new
【发布时间】:2015-08-05 20:34:52
【问题描述】:

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 返回nilmodules 也是如此。

我错过了什么吗?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您在 class 关键字和 Class::new 之间错过的有趣点是 - Class::new 接受块。因此,当您将使用Class::new 创建类对象时,您还可以访问周围的变量。因为blockclosure。但这是不可能的,因为您将使用关键字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也有同样的区别。

    【讨论】:

    • 更多信息请参考this............
    【解决方案2】:

    Class.new 返回一个objectclass A 返回nilmodules 也是如此。

    这是错误的。类/模块定义返回在类/模块主体内评估的最后一个表达式的值:

    class Foo
      42
    end
    # => 42
    

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

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

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

    【讨论】:

    • 在当前版本的 Ruby 中返回一个 Symbol 表示方法的名称——我不知道。感谢您的信息。您在哪个版本中找到了此功能。我现在在 1.9.3
    • @ArupRakshit:2.0 或 2.1,不确定。我已经使用 2.1 很长一段时间了,所以我不能确定。不过,它记录在发行说明中。
    猜你喜欢
    • 2012-09-27
    • 2018-06-18
    • 2012-10-20
    • 2012-05-04
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多