这个Ruby使用Class.new创建类的方式,

Cur*_*ind 1 ruby metaprogramming

请考虑以下代码:

module MyClass
 def foo
  "method"
 end
end
Run Code Online (Sandbox Code Playgroud)

现在,我可以照常实例化此类的新类

@my_new_class = MyClass.new
Run Code Online (Sandbox Code Playgroud)

或者,我可以做一些元编程魔术

@my_new_class = Class.new { include MyClass }.send :new 
Run Code Online (Sandbox Code Playgroud)

问题是两者之间有什么区别?

Uri*_*ssi 5

上面的代码(几乎)等效于:

MyNewClass = Class.new { include MyClass }
@my_new_class = MyNewClass.new
Run Code Online (Sandbox Code Playgroud)

就像

class MyNewClass
  include MyClass
end
@my_new_class = MyNewClass.new
Run Code Online (Sandbox Code Playgroud)

using可以动态Class.new声明一个匿名新类:

使用给定的超类(如果没有给出参数,则为Object)创建一个新的匿名(未命名)类。您可以通过将类对象分配给常量来给类命名。

如果给出了一个块,则将其传递给类对象,然后使用将该块在此类的上下文中进行评估class_eval