rails 定名空间(转)

    添加时间:2013-5-10 点击量:

    转载 http://blog.csdn.net/ruby_cn/article/details/187360


     一般来说,在模块定一种定义一个类使得这个类能在本身自力的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定一到一个模块中。

    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: