【问题标题】:Ruby require_relative executing script?Ruby require_relative 执行脚本?
【发布时间】:2013-06-19 14:32:52
【问题描述】:

我正在使用 ruby​​ 开发游戏服务器,在测试期间我无法单独测试组件。我没有从我的启动器获得输出,只是服务器,所以我注释掉了服务器的初始化——但 Eclipse 仍然显示来自服务器的输出!

然后我转到命令行,假设 eclipse 正在查看错误的文件(git 之前把它弄乱了,但正如你所看到的,堆栈跟踪显示 Server.rb 正在从第 5 行全部执行:require_relative 'Server':

这是文件的文本内容:

class Launcher


  puts "File saved at #{File.mtime($0)}"


  require_relative 'Server'
  require_relative 'Game'

  #STDOUT.sync = true

  puts "Launcher started"
  #server = Server.new
  print "server made"
  game = Game.new
  #serverThread = Thread.new{server.start()}
  gameThread = Thread.new{game.start()}

  while (running)
    print "Stop? "
    input = gets.chomp
    if (input.equals?("yes"))
      running = false
    end
  end

  server.stop
  game.stop
  gameThread.join
  serverThread.join

end

和终端输出:

C:\Users\gossfunkel\git\citadelserver\RubyCitadelServer>ruby Launcher.rb
File saved at 2013-06-22 18:16:44 +0100
Server starting up at 2013-06-22 18:16:47 +0100...
C:/Users/gossfunkel/git/citadelserver/RubyCitadelServer/Server.rb:20:in `recvfro
m': Interrupt
        from C:/Users/gossfunkel/git/citadelserver/RubyCitadelServer/Server.rb:2
0:in `run'
        from C:/Users/gossfunkel/git/citadelserver/RubyCitadelServer/Server.rb:1
5:in `start'
        from C:/Users/gossfunkel/git/citadelserver/RubyCitadelServer/Server.rb:3
0:in `<class:Server>'
        from C:/Users/gossfunkel/git/citadelserver/RubyCitadelServer/Server.rb:1
:in `<top (required)>'
        from Launcher.rb:5:in `require_relative'
        from Launcher.rb:5:in `<class:Launcher>'
        from Launcher.rb:1:in `<main>'

如何在不发生这种情况的情况下需要文件?应该这样吗?

【问题讨论】:

  • 请发文字,不要截图。图片不放大就无法阅读,也不能复制粘贴。
  • 对不起,假设图像会更大。我似乎无法从 cmd 复制粘贴,但我已将 Launcher 代码放入。
  • 啊,你在 Windows 上。为了将来参考,要从cmd 窗口复制,请右键单击它的任意位置;从上下文菜单中选择Mark;用鼠标指针拖动一个矩形;按键盘上的return。现在它在您的剪贴板上。您可能需要将其粘贴到编辑器中并进行整理。

标签: ruby windows eclipse require relative-path


【解决方案1】:

如果没有看到课程,我无法判断,但我猜也是

  • game.start 做的比你想象的要多,正在为自己启动服务器

  • 正如您的主题行所暗示的,您正在运行与您正在编辑的文件不同的文件(或者一旦更改文件就不会保存文件)。通过在程序顶部放置一个明显的puts 来检查。类似的东西

    puts "File saved at #{File.mtime($0)}"
    

    应该做的伎俩

  • 经过讨论,似乎还有第三种选择。 Server.pm 中的代码创建并运行服务器以及定义类。您需要删除 require 以及使用 Server 类的行。

【讨论】:

  • 我添加了这条线,它工作得非常好——但puts "Launcher started" 线仍然没有运行。更重要的是,我刚刚发现堆栈跟踪表明 Server.rb 正在从第 5 行运行:require_relative 'Server'!
  • 是的,我可以相信。 require 执行您需要的文件中的任何可执行语句。删除require 以及电话,你应该没问题。
  • 哦!那么如何在不执行的情况下使用其他文件中的类呢?
  • 你把你的类写在文件里,里面什么都没有。然后require 并从其他文件中调用它们。
  • 我刚刚意识到自己是多么的大量愚蠢。感谢您帮助我发现我的错误!
猜你喜欢
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2013-10-11
  • 2023-03-05
相关资源
最近更新 更多