我遇到了开发一个项目的奇怪困难。我没有足够的课程经验所以这就是我在这里问的原因。我有一个用一个参数初始化的类,我需要其他类来调用该类函数,但我不能直到该类被初始化,所以我问我怎么能这样做。
以下是我所谈论的一些例子:
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
答案 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类中有两种方法 - 实际上是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