理解Ruby中的命名空间
在下面的代码中:
::Trace.tracer = ::Trace::ZipkinTracer.new()
Trace
和ZipkinTracer
之间的关系是什么?
ZipkinTracer
位于Trace
命名空间内,如下所示:
module Trace class ZipkinTracer # ... end end
::
之前常量名称意味着您指向根。 例如,在以下代码中:
class Class1 end module Module1 class Class1 end def foo ::Class1 end end
::Class1
确保您引用“root” Class1
。 如果你有:
def foo Class1 end
将引用Module1::Class1
。
此代码执行以下操作。 首先,它实例化ZipkinTracer
类:
new_instance = Trace::ZipkinTracer.new()
然后,它调用Trace
模块的#tracer=
method:
Trace.tracer=( new_instance )
Ruby语法允许将其重写为
Trace.tracer = new_instance
在这种情况下,不会发生任何分配,但会调用以=
结尾的方法。 在Ruby中允许以=
结尾的方法,通常用于属性赋值,它们的特殊之处在于它们总是返回指定的值 (即它们的参数),而不管您可能尝试规定的其他返回值是什么:
class Foo def bar=( value ) puts "Method #bar= called!" @bar = value puts "Trying to return Quux!" return "Quux!" end def bar; @bar end end foo = Foo.new foo.bar #=> nil foo.bar = "Baz!" #=> Method #bar= called! #=> Trying to return Quux! #=> "Baz!" -- attempt to explicitly return "Quux!" failed foo.bar #=> "Baz!"