我是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中,我认为我没有在类的定义中实例化一个类。
答案 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解释性本质意味着它倾向于将模块和类定义之类的东西更松散地处理,这就是允许这种行为的原因。