如何将文件加载到类范围中

时间:2017-05-24 10:46:46

标签: ruby

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语句可以解决问题,但它无法满足我对文件加载到类范围的要求。

问题与范围门有关,但我无法使其发挥作用。我读到类中的所有方法都可以访问实例变量。为什么我收到错误?  任何人都可以帮忙解决方案吗?

2 个答案:

答案 0 :(得分:3)

实例变量属于对象(“实例”),这就是它们被称为实例变量的原因。这里有两个完全不同的对象:InterfaceServerInterfaceServer的实例。它们是不同的对象(毕竟,它们甚至不是同一个类!InterfaceServer有类ClassInterfaceServer的实例有类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)

当Ruby加载require_relative @channel_path类时调用

InterfaceServer,但@channel_path仅在实例化类后才定义。

如果要在运行时定义要加载到类中的模块,可以将要包含的方法放在' _implementation'不同模块中的文件,以及类中的每个模块include

class InterfaceServer; end

channels.each do |channel|
  InterfaceServer.include Object.const_get(channel.capitalize)
end