我花了一段时间调试一个问题,其中我使用Module
而不是module
来声明模块。为什么Ruby具有module
和Module
(以及类似class
和Class
),具有不同的语义?见下面的例子:
class C; end; # ok
Class C2; end; # error
C3 = class.new # error
C4 = Class.new # ok
有两种不同的结构似乎令人困惑,这些结构仅因情况而异。
答案 0 :(得分:4)
class Foo; end
大致与Foo = Class.new
相同,但存在一些关键差异。所有这些也适用于module Bar; end
与Bar = Module.new
。
Class.new
允许创建匿名(未命名)类,而class; end
是语法错误。这使得前者对元编程更有用。
class
创建新的词法范围,而Class.new do ... end
则不会。 E.g:
class Foo; BAR = 42; end
Baz = Class.new { QUX = 42 }
BAR # NameError: uninitialized constant BAR
Foo::BAR #=> 42
QUX #=> 42
Baz::QUX #=> 42 (warning: toplevel constant QUX referenced by Baz::QUX)
由于Class.new do ... end
是一个闭包,你可以关闭局部变量。 class ... end
不能。 E.g。
foo = 42
class Foo; puts foo; end # NameError: undefined local variable or method `foo' for Foo:Class
Class.new { puts foo } # (prints 42)
class
立即为该课程命名,而Class.new
does it on assignment (last)。
Class.new
不能用于重新打开现有的类(必须使用class_exec
或类似的类),而class Foo; end
如果已存在则重新打开Foo
并且一个班级。
除了功能差异之外,关键字语法可以更容易阅读,类似于{}
与Hash.new
和[]
与Array.new
的对比。
答案 1 :(得分:2)
Class是一个对象,类的实例 http://www.ruby-doc.org/core-2.1.1/Class.html
class是定义类
的ruby关键字class Hello
end
Hello.new