Foo类有什么区别;结束& Foo = Class.new(和模块​​/模块)?

时间:2014-05-21 01:39:20

标签: ruby semantics

我花了一段时间调试一个问题,其中我使用Module而不是module来声明模块。为什么Ruby具有moduleModule(以及类似classClass),具有不同的语义?见下面的例子:

class C; end; # ok
Class C2; end; # error
C3 = class.new # error
C4 = Class.new # ok

有两种不同的结构似乎令人困惑,这些结构仅因情况而异。

2 个答案:

答案 0 :(得分:4)

class Foo; end 大致Foo = Class.new相同,但存在一些关键差异。所有这些也适用于module Bar; endBar = Module.new

  • class is a keywordClass is simply a constant name与其他任何人一样。

  • 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