在InterfaceServer#initialize
中,我打算构建一个文件路径,并将文件加载到InterfaceServer
类的范围内。
这是我的代码:
class InterfaceServer
def initialize(channel)
@channel_path = channel + "_implementation"
end
require_relative @channel_path
end
我收到此错误:
error => `require_relative': no implicit conversion of nil into String (TypeError)
在方法中包装require_relative
语句可以解决问题,但它无法满足我对文件加载到类范围的要求。
问题与范围门有关,但我无法使其发挥作用。我读到类中的所有方法都可以访问实例变量。为什么我收到错误? 任何人都可以帮忙解决方案吗?
答案 0 :(得分:3)
实例变量属于对象(“实例”),这就是它们被称为实例变量的原因。这里有两个完全不同的对象:InterfaceServer
和InterfaceServer
的实例。它们是不同的对象(毕竟,它们甚至不是同一个类!InterfaceServer
有类Class
,InterfaceServer
的实例有类InterfaceServer
),所以它们有不同的实例变量。
我的代码需要将文件加载到
InterfaceServer
类的范围内。 [...] 在方法中包装require_relative
语句可以解决问题,但是它无法满足我对文件加载到类范围的要求。
require_relative
只是运行该文件。它与范围无关。找到require_relative
的电话无关紧要。
(哦,而且:require_relative
不是一个语句,它是一个表达式。实际上,Ruby中没有语句,一切都是表达式。)
问题与范围门有关
不,不是。
我读到类中的所有方法都可以访问实例变量。
实例变量属于实例。它们与方法无关。
为什么我收到错误?
@channel_path
的实例变量InterfaceServer
与 @channel_path
的实例的实例变量InterfaceServer
无关。由于您从未分配到@channel_path
的实例变量InterfaceServer
,因此它不存在,并且不存在的实例变量会计算为nil
,因此您正在调用require_relative
nil
作为论据。
任何人都可以帮忙解决问题吗?
不是,因为你没有说明问题。你正在做的是a)不可能(这个类有多个实例,所以应该使用哪个实例的@channel_path
?)和b)非感性的(没有“require
这样的东西将文件放入类的范围内。)
答案 1 :(得分:-1)
require_relative @channel_path
类时调用 InterfaceServer
,但@channel_path
仅在实例化类后才定义。
如果要在运行时定义要加载到类中的模块,可以将要包含的方法放在' _implementation'不同模块中的文件,以及类中的每个模块include
。
class InterfaceServer; end
channels.each do |channel|
InterfaceServer.include Object.const_get(channel.capitalize)
end