如何在ruby脚本中继承模块?

时间:2012-09-13 06:49:12

标签: ruby

我有一个像

这样的层次结构

ABC(文件夹)----> abc.rb,def.rb

DEF(文件夹)----> a1.rb,b1.rb

GHI(文件夹)----> x1.rb,y1.rb

我想继承/包含def.rb,它是abc.rb中的一个模块,然后a1应该继承abc.rb,并且应该能够访问def.rb中定义的所有方法。

现在,我在每个脚本文件中包含def.rb,但我不想这样做。我只是想垂直继承。

2 个答案:

答案 0 :(得分:4)

很难处理类似ABC的命名系统)

如果您想在每个课程中包含10个模块,您可以这样做。我们假设你有模块ModuleTest::FilesModuleTest::Network

module_test / network.rb

中的

module ModuleTest
    module Network
        def network
            puts 'hello from ModuleTest::Network#network'
        end
    end
end

in module_test / files.rb

module ModuleTest
    module Files
        def files
            puts 'hello from ModuleTest::Files#files'
        end
    end
end

你可以像这样制作一些ModuleTest::Base类:

require 'module_test/files'
require 'module_test/network'

module ModuleTest
    class Base
        include Files
        include Network
    end
end

此类包含您拥有的所有功能,因此从中继承您的类:

require 'module_test/base'

class Foo < ModuleTest::Base 
end

foo = Foo.new
foo.network
foo.files

输出:

>ruby -I. foo.rb
hello from ModuleTest::Network#network
hello from ModuleTest::Files#files

答案 1 :(得分:0)

让我首先指出我怀疑我误解了你的问题,因为我不明白你为什么要这样做。所以,如果是这种情况,请指出,我将删除它。

您描述的过程有效(至少对我来说是Ruby 1.9.3)。

module Def
  def method_from_def
    puts "Method from Def"
  end
end

class Abc
  include Abc
end

class X < Abc
end

X.new.method_from_def #=> "Method from Def"

您可能需要在您的require语句中稍微具体一些,但如果您已经能够“包含”脚本,那么您已经解决了这个问题。 (除非'包含'表示将其复制并粘贴到源文件中。)