使用<::时的类继承

All*_*ate 0 ruby ruby-on-rails

REST API railscast具有以下代码示例:

module Api
  module V1
    class ProductsController < ApplicationController
      class Product < ::Product
        def as_json(options={})
          super.merge(released_on: released_at.to_date)
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我无法遵循以下内容:

  class Product < ::Product
Run Code Online (Sandbox Code Playgroud)

......呢?当我尝试在irb中重新创建类似的东西时,我得到:

module Fooirb(main):001:0> module Foobar
irb(main):002:1> class Product < ::Product
irb(main):003:2> end
irb(main):004:1> end
NameError: uninitialized constant Product
    from (irb):2:in `<module:Foobar>'
    from (irb):1
Run Code Online (Sandbox Code Playgroud)

屏幕演员

Jwo*_*sty 6

::令牌表示命名空间,如果没有什么,直接使用之前,它访问顶级命名空间.例如,采取这个小程序:

class Bar
  def initialize
    puts "New ingot created"
  end
end

module Foo
  class Bar
    def initialize(location)
      puts "New bar built in #{location}".
    end
  end

  def self.new_bar(which)
    if which == :top
      Bar.new("Rubytown, USA")
    else
      ::Bar.new
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您致电Foo.new_bar(:top),则会New bar built in Rubytown, USA打印消息.相反,如果你使用Foo.new_bar(:place_to_drink)它,那么它会打印New ingot created".