当我打电话给这样的课程或模块时:
module Somemodule
end
class Someclass
end
这些与我将它们设置为常量时相同吗?
Somemodule = Module.new
Someclass = Class.new
Somemodule
和Someclass
只是代表Module.new
和Class.new
的常量吗?
答案 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。