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]
使用配置单例(大致):
然后classIO
将需要使用更新的版本,但是这是合适的
如果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。。。。adef self.avr_conf
肯定在那里的某个地方?你是在修补现有的,不知道这是否是故意的。在这种情况下,avr_conf
是一个实例方法,而不是类方法,所以它不是那么简单。这个例子似乎有点混乱。@tadman:是的,因此更新了(您可能还没有加载)实例。啊,我现在明白了。这就解释了。
avr = AVR.new('something')
avr.avr_conf[a] = b