Ruby类之间的通信

3

我在开发一个项目时遇到了一些奇怪的困难。由于我对类的经验不足,所以我在这里询问。我有一个类,它是用一个参数初始化的,我需要其他类调用该类的函数,但在该类初始化之前我无法这样做,因此我想知道如何解决这个问题。

以下是我所讲述的一些示例:

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

这里似乎没有简单的方法。AVR需要初始化一个device,而在setMode方法中没有设备。你没有展示IO类的完整代码吗? - Sergio Tulentsev
@SergioTulentsev 这只是一个想法,但我希望在初始化每个子类之后,会以某种方式进行主类的初始化,以便不会遗漏未加载的类。 - Aurimas Niekis
我觉得整个类没有显示出来。上面的代码甚至无法运行?因为 class IOsetMode 尝试在 AVR 上运行一个单例方法... 是吗?AVR 一定还有更多内容... def self.avr_conf 必须在某个地方吧? - slindsey3000
你正在对现有的 IO 类 进行猴子补丁,不知道这是否是有意为之。 - steenslag
3个回答

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不能/无法获取实例,则类/单例配置可能更有意义,尽管这种方法总是让我有点紧张。


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

在这种情况下,avr_conf 是一个实例方法,而不是类方法,所以情况并不像那么简单。这个例子似乎有些混淆。 - tadman
@tadman:是的,因此更新了关于实例的内容(您可能尚未加载)。 - maerics
啊,我现在明白了。那就解释了。 - tadman

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接