建立名字空間(namespaces)

來源:互聯網
上載者:User

         一般來說,在模組定一種定義一個類使得這個類能在自己獨立的namespace裡。這樣你的類就不會因為和其它模組中的類重名而出問題,比如:

  module Foo
    class Joy
       def initialize(one, two)
           puts "one: [#{one}] two: [#{two}]"
       end
    end
  end

  module Bar
    class Joy
      def initialize(something)
         puts "Do #{something} already!"
      end
    end
  end

這樣的話,你就不能這樣定義Joy類了:

  Joy.new('a', 'b')
 
因為你的當前namespace中沒有Joy這個類,但是,你可以這樣定義: 
 

  Foo::Joy.new('a', 'b')
或者

  Bar::Joy.new('a crossword puzzle')

因為Joy在模組Foo和Bar中都定義了。

作為一個模組的編寫者,或者一些類似的類,你可能會把它們放到一個模組定義中。但是作為模組的使用者,每次都敲這麼多字母可能比較煩人,一個辦法是可以用別名:

  Joy = Foo::Joy
  然後,你就可以用這個別名了:
 
  Joy.new('a', 'b')
 
  另一個解決辦法就是使用‘include’:

  include Foo

  這樣,就可以直接使用Joy而不必寫全Foo::Joy了。
 
  而
  include Bar
可以讓你直接使用Joy而不必寫全Bar::Joy了。

  但是,如果你如果寫了上面兩個include語句,那麼Joy將指向最後一個唯一的可能的對象,比如:

 

  include Foo
  include Bar
那Joy將指向Bar::Joy。但是,如果你再寫上

  include Foo
 Joy還是將指向Bar::Joy。

   這種簡介方式也有一定嚴格的範圍要求。如果你在一個類的定義中指明了include一個模組,那麼這個模組的對象的簡略寫法只在這個類中有效;如果你在一個模組中指定了include語句,那麼整個模組中都可以使用include中對象的縮寫。
   如果沒有指定namespace,那麼預設為匿名namespace。而且,如果你想在一個檔案中的變數等被外部能夠使用(尤指其它檔案),最好將它定義在模組中。比如,檔案foo.rb內容如下:
   var1=99
  在另外一個檔案中,你想這樣:

  require 'file1'
  puts var1       
  將會出錯:
  NameError: undefined local variable or method var1
  所以,最好還是把var1定一到一個模組中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.