Ruby类间通信

Ruby类间通信,ruby,Ruby,我在开发一个项目时遇到了奇怪的困难。我没有足够的课程经验,所以这就是我在这里问的原因。我有一个类是用一个参数初始化的,我需要其他类来调用这个类的函数,但我不能,直到那个类被初始化,所以我问我如何才能做到这一点 下面是我所说的一些例子: class AVR def initialize(device) @device = device @avr_conf = YAML::load(File.open("./devices/#{device}.yaml"))

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

下面是我所说的一些例子:

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

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

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

您需要一个实例,或者将
AVR\u conf
设置为类方法(并以不同的方式初始化)

举个例子:

avr = AVR.new(a_device)
avr.avr_conf[a]
使用配置单例(大致):

然后class
IO
将需要使用更新的版本,但是这是合适的


如果IO不打算/无法获取实例,那么类/单例配置可能更有意义,尽管这种方法总是让我有点紧张。

Ruby类中有两种方法-实际上是
class
instance
方法。 类方法使用
self.
前缀定义,无需初始化类:

class AVR
  def self.avr_conf
    'something here'
  end
end
因此,在这种情况下,您必须调用:
AVR.AVR\u conf
,以获得
“这里有东西”
结果

但是,在您的情况下,
@avr_conf
变量在
initialize
方法中定义,您必须使用以下内容创建类实例:

avr = AVR.new('something')
avr.avr_conf[a] = b

这里似乎没有捷径
AVR
需要初始化
设备
,并且
setMode
方法中没有设备。你没有给我们看
IO
类的完整代码吗?@SergioTulentsev这只是个想法,但我想以某种方式创建Master类,在初始化之后,每个子类也将被初始化,这样就不会丢失卸载的类了?我觉得整个类都没有显示出来。上面的代码甚至无法运行?因为
class IO
setMode
正在尝试在AVR上运行单例方法。。。对的必须有更多的AVR。。。。a
def self.avr_conf
肯定在那里的某个地方?你是在修补现有的,不知道这是否是故意的。在这种情况下,
avr_conf
是一个实例方法,而不是类方法,所以它不是那么简单。这个例子似乎有点混乱。@tadman:是的,因此更新了(您可能还没有加载)实例。啊,我现在明白了。这就解释了。
avr = AVR.new('something')
avr.avr_conf[a] = b