如何在模块中的另一个ruby类的同一级别引用ruby类?

时间:2016-01-04 18:31:48

标签: ruby

例如:

module Example
  class A
    def initialize
      puts "A"
    end
  end

  class B
    def initialize
      ::A.new
    end
  end
end

而不是:

module Example
  class A
    def initialize
      puts "A"
    end
  end

  class B
    def initialize
      Example::A.new
    end
  end
end

2 个答案:

答案 0 :(得分:3)

B可以像这样访问A

module Example
  class A
    def initialize
      puts "A"
    end
  end

  class B
    def initialize
      A.new
    end
  end
end

使用::A告诉ruby在顶级范围内查找A

答案 1 :(得分:3)

在完全相同的级别上引用一个类真的不是一个很好的方法。但是,了解Ruby常量分辨率的工作方式在很多情况下都会涵盖你。

有两个范围门:关键字moduleclass。搜索从当前范围开始。如果在那里找不到常量,则搜索在树上继续前一个范围。等等,直到达到主要范围。

::放在常量前面引用主范围。

<小时/> 遵循这些规则,以B#new为例:

Example::A.new

Example范围内搜索B。它在那里找不到它。它转到Example的范围并使用Example

::A.new

从主范围开始,在那里搜索A。它没有找到,因此失败。

::Example::A.new

从主范围开始,在那里搜索Example。它找到它并在该范围内搜索A。它找到它并使用A

A.new

B的范围开始。它在那里找不到它并向上移动到Example的范围。它在那里找到A并使用它。