Ruby级间通信

时间:2012-01-17 16:43:05

标签: ruby

我遇到了开发一个项目的奇怪困难。我没有足够的课程经验所以这就是我在这里问的原因。我有一个用一个参数初始化的类,我需要其他类来调用该类函数,但我不能直到该类被初始化,所以我问我怎么能这样做。

以下是我所谈论的一些例子:

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 个答案:

答案 0 :(得分:2)

您要么:需要一个实例,要么使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 可能更有意义,尽管这种方法总让我有些紧张。

答案 1 :(得分:0)

如果尚未初始化独立类,则可以让依赖方法简单地抛出异常:

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扩展方法需要知道应修改哪个实例。

答案 2 :(得分:0)

Ruby类中有两种方法 - 实际上是classinstance方法。 类方法使用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