美文网首页程序员
ruby中include, extend, prepend比较

ruby中include, extend, prepend比较

作者: 小新是个程序媛 | 来源:发表于2018-05-24 12:04 被阅读66次

    include是把模块注入目标类或者模块中作为实例方法
    prepend也是是把模块注入目标类或者模块中作为实例方法
    他俩的区别是扩展module在祖先链的位置不同,include引入的module会在祖先链的上方,prepend引入的module会在祖先链的下方
    extend是把模块注入目标类或者模块中作为类方法,不包含在祖先链上

    示例代码如下:

    module A
      def test
        puts 'I am test in module A'
      end
    end
    #B将新增一个实例方法my_method,B的祖先链中将增加A,位置在当前类之后
    class B
      include A
    end
    
    #C将新增一个实例方法my_method,而C的祖先链中将增加A,位置在当前类之前
    class C
      prepend A
    end
    
    #D将新增一个类方法my_method,而D的祖先链中没有A。
    class D
      extend A
    end
    
    B.test #=>异常
    
    C.test #=>异常
    
    D.test #=>I am test in module A
    
    b=B.new.test #=>I am test in module A
    
    c=C.new.test #=>I am test in module A
    
    d=D.new.test #=>异常
    
    puts B.ancestors
    #B=>A=>Object=>Kernel=>BasicObject
    #=>包含A
    puts C.ancestors
    #A=>C=>Object=>Kernel=>BasicObject
    #=>包含A
    puts D.ancestors
    #B=>Object=>Kernel=>BasicObject
    #=>不包含A
    
    
    module A
      def my_method
        puts "in A"
      end
    end
    
    class B
      include A
      def my_method
        puts "in B"
      end
    end
    
    class C
      prepend A
      def my_method
        puts "in C"
      end
    end
    
    class D
      extend A
      def my_method
        puts "in D"
      end
    end
    
    B.new.my_method   #输出 ‘in B’
    C.new.my_method   #输出 ‘in A’
    D.new.my_method   #输出 ‘in D’
    D.my_method       #输出 ‘in A’
    

    相关文章

      网友评论

        本文标题:ruby中include, extend, prepend比较

        本文链接:https://www.haomeiwen.com/subject/jvfdjftx.html