模块和类是作为常量实现的吗?

时间:2017-10-31 21:07:00

标签: ruby

当我打电话给这样的课程或模块时:

module Somemodule
end

class Someclass
end

这些与我将它们设置为常量时相同吗?

Somemodule = Module.new
Someclass = Class.new

SomemoduleSomeclass只是代表Module.newClass.new的常量吗?

1 个答案:

答案 0 :(得分:0)

您的所有问题都在The Pickaxe中有答案。

class ‹ scope:: › classname ‹ < superexpr ›
    body
end
  

Ruby类定义创建或扩展类Class的对象   在正文中执行代码。在第一种形式中,命名类是   创建或扩展。生成的Class对象被分配给a   常量命名的类名(继续阅读范围规则)。这个名字   应该以大写字母开头。 ...

module name
    body
end
  

模块基本上是一个无法实例化的类。像一个   class,它的主体在定义期间执行,并由此产生   模块对象存储在常量中。

Class.new( super_class=Object ) ‹{…}›→cls

  

使用给定的超类(或。)创建一个新的匿名(未命名)类   如果没有给出参数,则为Object)。如果用块调用,那个块   被用作班级的主体。

Module.new→mod

Module.new {|mod| … }→mod

  

创建一个新的匿名模块。如果给出一个块,则传递给它   模块对象,并在此上下文中评估块   模块使用module_eval。

这个名字有一些有趣的东西:

some_class = Class.new
obj        = some_class.new
puts "Initial name is #{some_class.name.inspect}"

SomeClass = some_class
puts "After assigning to the constant SomeClass, the name is #{some_class.name}"
puts "also works via the object: #{obj.class.name}"

执行:

$ ruby -w t.rb 
Initial name is nil
After assigning to the constant SomeClass, the name is SomeClass
also works via the object: SomeClass

<强>更新

  

Somemodule和Someclass只是代表的常量   Module.new和Class.new?

当然不是。 Module.new创建一个类Module的实例,其指针存储在常量Somemodule中。 Class.new创建了一个类Class的实例,其指针存储在常量Someclass中。

有关

class Someclass
end

Someclass = Class.new

从上面的定义和一个未命名的类在赋值给一个常量后命名的事实,我几乎可以肯定它是同一个东西,但我不是专家。查阅Guru的答案,如Jörg