如何从模块或类继承默认数据

时间:2011-03-15 04:14:33

标签: ruby

我正在开发一个应用程序来自动测试SQL注入漏洞。它目前被命名为Deft,用于大学项目。

我希望能够从命令行或交互式控制台运行测试。我正在编写几个类。 (Deft::CliDeft::Console等。)

这就是我想我想做的事。

module Deft
  module App
    attr_accessor :origin
    @origin = { "host" => "localhost", "port" => "80" }
  end
end

module Deft
  class Console
    include App

    def initialize
      puts origin
    end
  end
end

示例已经简化,但关键是默认值(和结构)在Deft::App模块中定义。

我可以说的问题是,尽管来自控制台实例内部的methods.grep(/origin/)确实让我["origin=", "origin"]调用origin,但会返回nil。而不是我在Deft::App中定义的值。它有意义,它不起作用,但我不知道如何使它工作。

4 个答案:

答案 0 :(得分:3)

也许我太简单地采用了简化的例子,但解决它的一种方法是摆脱attr_accessor类方法调用,只需将origin作为常量OriginORIGIN

答案 1 :(得分:1)

这个怎么样?

module Deft
  class DefaultConsole
    attr_accessor :origin
    def initialize
      @origin = {'host' => 'localhost', 'port' => 80}
    end
  end

  class Console < DefaultConsole
    def initialize
      super
      puts origin
    end
  end
end

Deft::Console.new
# => {'host' => 'localhost', 'port' => 80}

答案 2 :(得分:0)

试试这样:

module Deft
  module App
    attr_accessor :origin
    def init
      @origin = { "host" => "localhost", "port" => "80" }
    end
  end
end

module Deft
  class Console
    include App

    def initialize
      init
      puts origin
    end
  end
end

Deft::Console.new

答案 3 :(得分:0)

感谢大家添加了他们的意见。我将继续回答我自己的问题,这是我所希望的。

module Deft
  module App
    @@origin = { "host" => "localhost", "port" => "80" }

    def origin        ; @@origin        ; end
    def origin=(args) ; @@origin=(args) ; end
  end
end

如果有人想使用attr_accesor复制并清理它,那么我很乐意将其编辑回我的问题并接受他们的回答。