在下面的代码中:
::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
确保您引用“根” Class1
。如果你有:
def foo
Class1
end
将Module1::Class1
被提及。
此代码执行以下操作。首先,它实例化类ZipkinTracer
:
new_instance = Trace::ZipkinTracer.new()
然后,它调用模块#tracer=
的方法Trace
:
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!"