3

在下面的代码中:

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

Trace和之间的关系是什么ZipkinTracer

4

2 回答 2

8

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被提及。

于 2013-06-28T10:27:53.537 回答
3

此代码执行以下操作。首先,它实例化类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!"
于 2013-06-28T10:41:02.663 回答