Как мне наследовать данные по умолчанию от модуля или класса - PullRequest
1 голос
/ 15 марта 2011

Я работаю над приложением для автоматизации тестирования на уязвимость SQL-инъекций. В настоящее время он называется Deft и предназначен для университетского проекта.

Я хочу запускать тесты из командной строки или интерактивной консоли. Я кодирую несколько классов. (Deft::Cli, Deft::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 ]

3 голосов
/ 15 марта 2011

Возможно, я слишком упрощенно воспринимаю упрощенный пример, но один из способов исправить это - избавиться от вызова метода класса attr_accessor и просто сделать origin постоянной Origin или ORIGIN.

1 голос
/ 15 марта 2011

Как насчет этого?

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}
0 голосов
/ 15 марта 2011

Спасибо всем, кто добавил свой вклад. Я собираюсь пойти дальше и ответить на мой собственный вопрос, это работает, как я надеялся.

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

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

Если кто-то захочет скопировать и очистить это с помощью attr_accesor, то я буду рад отредактировать это обратно в мой вопрос и принять его ответ.

0 голосов
/ 15 марта 2011

Попробуй так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...