【问题标题】:Failed to run a very simple ruby script [duplicate]无法运行一个非常简单的 ruby​​ 脚本 [重复]
【发布时间】:2016-09-03 14:26:42
【问题描述】:

我创建了一个Ruby类Worker,文件名为Worker.rb

class Worker
 def initialize
  ...
 end

 def doTask(task_name)
  ...
 end
end

然后,我创建了另一个 Ruby 脚本文件,名为 run.rb(它需要 Worker):

require 'Worker'

worker = Worker.new
worker.doTask("sort")

这两个 ruby​​ 文件都直接位于项目文件夹下:

ProjectFolder/
      -- Worker.rb
      -- run.rb

我通过命令运行项目文件夹下的run.rb

ruby run.rb

但出现以下错误:

/Users/John/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- Worker (LoadError)
    from /Users/John/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from runme.rb:1:in `<main>'

为什么?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    我在查看@Geo 的 github 项目后发现,我应该使用:

    require_relative "worker"
    

    【讨论】:

      【解决方案2】:

      require 从所谓的加载路径而不是当前目录中查找所需的文件。由于在当前目录中查找的语法很笨拙,Ruby 1.9 引入了require_relative,它在当前目录中查找。

      像这样更改您的代码:

      require_relative "Worker"
      

      而不是

      require "Worker"
      

      【讨论】:

      • 能否解释一下,为什么?
      • 我得到了同样的错误......
      • 另外,为了遵循流行的 Ruby 命名约定,不应调用以大写字母开头的 Ruby 类文件,例如'worker.rb' 而不是 'Worker.rb'
      • 啊哈,我明白了问题所在,我的班级名称是Worker,大写为W,但文件名是worker.rb,较小的w,它适用于require_relative "worker"。但无论如何,我不明白你为什么要我在require 中添加“./”。
      【解决方案3】:

      这不起作用的原因是因为当前目录不是 ruby​​ 的默认加载路径的一部分。

      如果您运行以下命令,您将看到当前加载路径是什么,并确认当前目录不是该路径的一部分。

      ruby -e 'puts $LOAD_PATH'
      

      这应该回答您关于为什么所需文件未加载的主要问题。

      至于解决方案,require_relative 会起作用,并且在这种情况下可能是最好的解决方案。

      然而,如果不需要的话,在加载路径中插入目录仍然是有帮助的。例如,假设您有一个可以在文件系统中任何地方运行的脚本,并且您希望灵活地要求您同事的 foo 类的特定版本。

      /afs/some_cell/u/john/some_ruby_lib
        prod/
          foo.rb
          bar.rb
       prev/
          foo.rb
          bar.rb
       beta/
          foo.rb
          bar.rb
      

      在这种情况下,设置 RUBYSIM var(可能在包装器中)或在 ruby​​ 命令行上设置正确的包含路径可能是一个有用的解决方案。

      同样,您的同事并没有将此作为 gem 发布,他只是提供了一个共享目录。

      有几种方法可以在适当的时候将目录插入到加载路径中,如下所示:

      您可以使用 -I 命令行标志

      ruby -I some_path -e 'puts $LOAD_PATH'
      

      您可以设置 RUBYLIB 环境变量以包含您当前的目录。

      在 unix/linix/osx 上

      export RUBYLIB=some_path
      

      在窗户上

      设置 RUBYLIB=some_path

      【讨论】:

      • 当我在-Irun.rb 之间有点. 时,我得到同样的错误,当我删除点时,它只是挂在那里,我怎样才能获得更多的调试信息,我应该在命令中添加哪个标志?
      • man ruby​​ 或 ruby​​ -h 应该为您提供有关 ruby​​ 命令的更多信息
      • 无论如何,当我运行 ruby -I run.rb 时,它就挂在那里。即使我添加了一个简单的代码 puts 'helloworld' 作为 run.rb 的第一行,我也没有看到它,它只是挂在那里。
      • 你需要在 -I ruby​​ -I 之后给它一个路径。 run.rb 你可以试试 -I。 -I./ 另外,顺便说一句,您使用的是什么操作系统?
      • 这太复杂了,我已经找到了一个简单的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2016-11-08
      • 2010-11-25
      • 2018-03-15
      • 2012-09-04
      • 2014-09-03
      相关资源
      最近更新 更多