理解Ruby中的命名空间

在下面的代码中:

::Trace.tracer = ::Trace::ZipkinTracer.new() 

TraceZipkinTracer之间的关系是什么?

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!"