我可以在Ruby中使用模块内部的模块吗?

时间:2015-04-05 23:30:28

标签: ruby module

我是Ruby新手。我对这里的一些代码感到困惑:

http://hawkins.io/2012/03/defining_plugins_gems_railties_and_engines/

这是代码:

module Cashier
  class Railtie < ::Rails::Railtie
    config.cashier = Cashier

    initializer "cashier.active_support.cache.instrumentation"
      ActiveSupport::Cache::Store.instrument = true
    end
  end
end

我很惊讶这一行,大多数语言都不允许这样做:

    config.cashier = Cashier

所以我在模块Cashier的定义中,但我还可以实例化Cashier模块的实例并在此处使用它?这条线上发生了什么?当我在定义Cashier的代码内部时,如何分配Cashier?在Java中,我认为我没有在类的定义中实例化一个类。

1 个答案:

答案 0 :(得分:1)

你不是在这里实例化Cashier(你无论如何都不能在Ruby中创建模块实例);您只是引用Cashier常量,它指的是Module的一个实例,它已经在您到达此行时定义。

Ruby创建一个空的Module实例,并凭module Foo将其分配给Foo常量。可以将模块主体定义视为重新打开空模块并向其添加其他功能。 Ruby并不需要完整的模块定义,以便最终确定&#34;一个模块并将其分配给一个常量;它甚至在考虑身体定义之前创建并分配了它。

即代码:

 module Foo
   puts Foo.object_id
 end

在功能上等同于:

# Create a new Module instance and assign it to the Foo constant
Foo = Module.new

# Reopen the Module instance assigned to the constant Foo for modification
module Foo
  # Do stuff in here to add functionality to the Foo module
  # Since Foo is already defined, we can get its object_id.
  puts Foo.object_id
end

从编译语言的角度来看,这当然没有意义(毕竟,如果你还没有完成它的定义,你怎么知道Cashier是什么?),但Ruby&# 39; s解释性本质意味着它倾向于将模块和类定义之类的东西更松散地处理,这就是允许这种行为的原因。