:: ModuleName :: ClassName和ModuleName :: ClassName有什么区别

时间:2012-02-22 15:47:23

标签: ruby-on-rails ruby rubygems

在ruby中,我开始看到一个非常正常的做法,包括引用为:: ModuleName :: ClassName的模块和mixins,在过去它几乎只是ModuleName :: ClassName。

我想在这里得到一个体面的理解,为什么最近会看到这种做法,以及它的不同之处。

有什么区别?

有什么好处(如果先前没有回答这个问题)?

提前感谢您的意见。

2 个答案:

答案 0 :(得分:9)

如果您将::放在开头,那么您指的是全局命名空间,如果不是,则指的是您当前的命名空间。

通常,如果您的类/模块中没有同名的类/模块,则不需要在开头使用::

class Customer

  def to_s
    "Customer global"
  end

end


class Order

  class Customer
    def to_s
      "Customer within order"
    end
  end


  def initialize
    puts Customer.new
    puts ::Customer.new
  end


end

Order.new

将打印出来

Customer within order
Customer global

答案 1 :(得分:3)

当您执行::ModuleName::ClassName时,您说:

  

我希望您在根命名空间中查找::ModuleName::ClassName,忽略此代码是否在另一个模块中找到。因此,它总是会寻找一个名为::ModuleName::ClassName而没有其他

的类

当你这样说ModuleName::ClassName时,你会说:

  

我希望您先查看ModuleName::ClassName,但先查看当前范围,然后查看其他范围。所以,如果你有一个名为MyModule的模块,而我的模块引用了ModuleName::ClassName,那么首先尝试找到MyModule::ModuleName::ClassName,然后尝试解析::ModuleName::ClassName

当我定义这样的代码时,我几乎总是使用:: ModuleName :: ClassName来避免任何命名冲突。