zoukankan      html  css  js  c++  java
  • rails 命名空间(转)

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

  • 相关阅读:
    Arduino通信篇系列之print()和write()输出方式的差异
    通信协议之Modbus协议(一)
    CAD制图系列一之绘图、标注、修改、视图
    Arduino系列之pwm控制LED灯(呼吸灯)
    [转]GDB调试基础
    Linux上编辑然后执行一段脚本的机制
    [转]进程创建-终结流程图
    [ 转]Linux进程关系
    Linux进程管理(四、 进程终结)
    Linux进程管理(三、 线程)
  • 原文地址:https://www.cnblogs.com/wws19125/p/3070412.html
Copyright © 2011-2022 走看看