Ruby 类别与类别新、模块与模块新

Ruby 类别与类别新、模块与模块新,ruby,Ruby,class和class.new和模块和模块.new之间有什么区别 我知道: 类。新建/模块。新建创建一个匿名的类/模块。当我们第一次将它赋给常量时,它就成为该类/模块的名称类/模块自动执行此操作 当我们想要继承时,我们可以传递一个参数:Class.new(祖先)。当我们不指定祖先时,它被设置为对象类使用以下语法:类A

class
class.new
模块
模块.new
之间有什么区别

我知道:

  • 类。新建
    /
    模块。新建
    创建一个匿名的
    /
    模块
    。当我们第一次将它赋给常量时,它就成为该
    /
    模块
    的名称<代码>类/
    模块
    自动执行此操作

  • 当我们想要继承时,我们可以传递一个参数:
    Class.new(祖先)
    。当我们不指定祖先时,它被设置为
    对象
    <代码>类使用以下语法:
    类A<祖先

  • Class.new
    返回一个
    对象
    <代码>A类返回
    nil
    模块
    s也是如此


  • 我遗漏了什么吗?

    class
    关键字和-
    class::new
    接受块之间,您遗漏了有趣的一点。因此,当您使用
    class::new
    创建类对象时,还可以访问周围的变量。因为阻塞是闭合的。但是,当您使用关键字
    class
    创建类时,这是不可能的。因为
    class
    创建了一个全新的范围,它不了解外部世界。让我举几个例子

    这里我使用关键字
    class
    创建一个类:

    count = 2
    
    class Foo
        puts count
    end
    # undefined local variable or method `count' for Foo:Class (NameError)
    
    这里有一个使用
    类。新的

    count = 2
    Foo = Class.new do |c|
        puts count
    end
    # >> 2
    
    关键字
    模块
    和也有同样的区别

    Class.new
    返回一个
    对象
    <代码>A类
    返回
    nil
    模块
    s也是如此

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

    class Foo
      42
    end
    # => 42
    
    通常,在类/模块主体内部计算的最后一个表达式将是一个方法定义表达式,在Ruby的当前版本中,该表达式返回一个
    符号
    ,表示方法的名称:

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

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

    ,在Ruby的当前版本中,它返回一个
    符号
    ,表示方法的名称——我不知道。谢谢你提供的信息。您在哪个版本中找到此功能。我现在是1.9。3@ArupRakshit:2.0或2.1,不确定。我在2.1上已经有一段时间了,所以我记不清了。但是,它在发行说明中有记录。请参阅更多信息。。。。。。。。。。。