Руби межклассовое общение - PullRequest
3 голосов
/ 17 января 2012

Я столкнулся со странной трудностью при разработке одного проекта.У меня недостаточно опыта с занятиями, поэтому я спрашиваю здесь.У меня есть один класс, который инициализируется с одним параметром, и мне нужны другие классы для вызова функций этого класса, но я не могу, пока этот класс не инициализируется, поэтому я спрашиваю, как я могу это сделать.

Вот несколько примеров того, что я говорюо:

class AVR
    def initialize(device)
        @device = device
        @avr_conf = YAML::load(File.open("./devices/#{device}.yaml"))
    end

    def avr_conf
        return @avr_conf
    end
end

class IO
    def setMode(a,b)
        "#{AVR.avr_conf[a]} = #{b}"
    end
end

Ответы [ 3 ]

2 голосов
/ 17 января 2012

Вам либо: нужен экземпляр, либо сделать avr_conf метод класса (и инициализировать по-разному).

С экземпляром:

avr = AVR.new(a_device)
avr.avr_conf[a]

С конфигурационным синглтоном (примерно):

class AVR
  def self.class_initialize(device)
    @@avr_conf ... etc ...
  end

  def self.avr_conf
    return @@avr_conf
  end
end

Тогда класс IO должен будет использовать обновленную версию, однако это уместно.

Если IO не собирается / не может получить экземпляр,class / singleton-config может иметь больше смысла, хотя такой подход всегда заставляет меня немного нервничать.

0 голосов
/ 17 января 2012

Существует два вида методов в классах Ruby - на самом деле class и instance методы.Методы класса определяются с префиксом self., и нет необходимости инициализировать класс:

class AVR
  def self.avr_conf
    'something here'
  end
end

Итак, в этом случае вы должны вызвать: AVR.avr_conf, чтобы получить 'something here' результат.

Но, в вашем случае, переменная @avr_conf определяет в методе initialize, и вам нужно создать экземпляр класса с помощью:

avr = AVR.new('something')
avr.avr_conf[a] = b
0 голосов
/ 17 января 2012

Вы могли бы заставить зависимый метод просто вызвать исключение, если независимый класс еще не инициализирован:

class IO
  def setMode(a, b)
    raise StandardError.new("AVR device is not initialized") unless AVR.avr_conf
    AVR.avr_conf[a] = b
  end
end

Обратите внимание, однако, что это решение требует, чтобы класс AVR был одноэлементным (или модулем), поскольку методы расширения IO должны знать, какой экземпляр следует изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...