【问题标题】:Making two Ruby classes talk to each other in the same directory让两个 Ruby 类在同一个目录中相互通信
【发布时间】:2014-04-26 13:41:58
【问题描述】:

我在同一个目录中有两个 .rb 文件

samplecode.rb
otherclass.rb

这里是 SampleCode 的内容

require 'otherclass'
include OtherClass

class SampleCode
  #...
end

这是OtherClass的内容

require 'samplecode'

class OtherClass
  #...
end

当我运行“ruby otherclass.rb”时,出现以下错误:

我不知道出了什么问题,因为这两个文件肯定在同一个目录中。什么给了?

【问题讨论】:

  • 这里有很多问题。您不应该在otherclass 中包含samplecodeotherclasssampleclass 中它应该是一种包含方式。这会导致循环依赖。
  • @JustinWood,Ruby 文件之间的循环依赖在多大程度上是个问题? Ruby 不会两次加载同一个文件。

标签: ruby include require


【解决方案1】:

尝试:

require './otherclass'

require './samplecode'

require 应该处理循环引用问题,但您当前的目录可能不在您的路径中。

【讨论】:

    【解决方案2】:

    require 方法在 Ruby 的 $LOAD_PATH 中搜索文件,出于安全原因,它不包括您的当前目录。因此,当您require 'sample_code' 时,它会在您的系统中查找该文件并找不到它,因为它在您的当前目录中。

    您应该将当前目录添加到搜索路径中,以便 Ruby 找到您的脚本:

    ruby -l . other_class.rb
    

    请注意,如果您尝试从sample_code.rb 所在的目录之外运行脚本,它将不起作用。更糟糕的是;如果当前目录中存在同名的不同文件,它将被加载并执行,而不是您的脚本。这是一个可能的攻击向量,也是当前目录不在搜索路径中的原因。

    【讨论】:

      【解决方案3】:

      试试这个:

      在加载不存在 ruby​​ 的 $LOAD_PATH 的文件时使用 require_relative

      read it for more info on require and require_relative

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 2015-04-20
        • 1970-01-01
        • 2012-06-22
        相关资源
        最近更新 更多