module Fabrication
module Syntax
# Extends Fabrication to provide make/make! class methods, which are
# shortcuts for Fabricate.build/Fabricate.
#
# Usage:
#
# require 'fabrication/syntax/make'
#
# User.make(:name => 'Johnny')
#
#
module Make
def make(*args, &block)
overrides = Fabrication::Support.extract_options!(args)
klass = name.underscore.to_sym
fabricator_name = args.first.is_a?(Symbol) ? "#{klass}_#{args.first}" : klass
Fabricate.build(fabricator_name, overrides, &block)
end
def make!(*args, &block)
overrides = Fabrication::Support.extract_options!(args)
klass = name.underscore.to_sym
fabricator_name = args.first.is_a?(Symbol) ? "#{klass}_#{args.first}" : klass
Fabricate(fabricator_name, overrides, &block)
end
end
end
end
Object.extend Fabrication::Syntax::Make
问问题
69 次
3 回答
0
命名空间。您可以使用运算符深入到嵌套的命名空间::
。
看一下这个:
module Galaxy
module StarSystem
module Planet
end
Galaxy # references Galaxy
StarSystem # references Galaxy::StarSystem
Planet # references Galaxy::StarSystem::Planet
end
end
Galaxy # references the Galaxy module
Galaxy::StarSystem::Planet # References the Planet module declared above.
Planet # Exception! No constant Planet exists in this namespace
如您所见,这允许您以保持模块化的方式构建代码。您可以编写一个使用不同类和模块的组件,但它们都位于一个命名空间下。从该代码中,您可以轻松访问在其自己的命名空间或父命名空间中声明的任何常量。但是其他代码看不到这些常量,除非您明确地深入研究它们。
结果是组织良好且结构化的组件,可以很容易地与其他组件混合,因为它们完全存在于一个名称中,不太可能与项目中的其他代码冲突。
于 2013-07-12T22:17:33.650 回答
0
它本质上是命名空间。你可以用 just 做同样的事情module Fabrication::Syntax::Make
。无论出于何种原因,嵌套它们是大多数知名 gem/项目所做的,出于这个未知的原因,我也是这样做的。我很想了解为什么人们通常更喜欢嵌套而不是更直接的方法。
于 2013-07-12T22:00:57.503 回答
0
就像你在最后一行一样。如果您module
在 other 内部定义module
,它将被命名空间。因此,您的代码Make
模块将可以从外部Fabrication
模块定义及其命名空间访问:
Fabrication::Syntax::Make
这允许您Make
在根名称空间中定义模块而不会发生命名冲突。
于 2013-07-12T22:02:37.013 回答