首页 > 新闻动态 >  

新闻动态
NEWS

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定一到一个模块中。

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