0

当我在 irb 中确实需要 './primes.rb' 时,我得到了这个:

  1.9.3-p392 :004 > require './primes.rb'
LoadError: cannot load such file -- ./primes.rb
    from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from (irb):4
    from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'

这是 primes.rb 文件:

# primes.rb
require 'debugger'

def prime?(num)
debugger
  (1..num).each do |i|
    if (num % i) == 0
      return false
    end
  end
end

def primes(num_primes)
  ps = []
  num = 1
  while ps.count < num_primes
    primes << num if prime?(num)
  end
end

if __FILE__ == $PROGRAM_NAME
  puts primes(100)
end

任何有关如何使其工作的建议将不胜感激!

当我确实需要亲戚时,它给了我这个:

1.9.3-p392 :010 > require_relative 'primes.rb'
LoadError: cannot infer basepath
    from (irb):10:in `require_relative'
    from (irb):10
    from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'

当我执行下面的第二个解决方案时,它给了我这个:

1.9.3-p392 :013 > $LOAD_PATH << "."
 => ["/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1", "/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/x86_64-darwin11.4.2", "/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby", "/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/vendor_ruby/1.9.1", "/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin11.4.2", "/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/vendor_ruby", "/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1", "/Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/x86_64-darwin11.4.2", "."] 
1.9.3-p392 :014 > require 'primes.rb'
LoadError: cannot load such file -- primes.rb
    from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from (irb):14
    from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'
1.9.3-p392 :015 > 

当我尝试撬开它时:

[4] pry(main)> require_relative 'primes.rb'
LoadError: cannot infer basepath
from (pry):2:in `require_relative'
[5] pry(main)> require 'primes.rb'
LoadError: cannot load such file -- primes.rb
from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
[6] pry(main)> .ls
Applications        Movies          git-completion.bash
Desktop         Music           rails_projects
Documents       Pictures        ruby
Downloads       Public          runwithfriends
Dropbox         code            shopify
Library         dev         sites
[7] pry(main)> require 'ruby/app_acad_mini_curriculum/debugging/primes.rb'
LoadError: cannot load such file -- ruby/app_acad_mini_curriculum/debugging/primes.rb
from /Users/RBonhardt/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
4

2 回答 2

0

尝试require_relative

require_relative 'primes.rb'

编辑: 请注意,这仅适用于脚本中。如果您尝试require将此脚本放入 irb 会话,则需要提供primes.rb. 原因是irb的位置在哪里。例如,尝试Dir.pwd在 irb 内部,您将看到require_relative正在尝试搜索的位置primes.rb

您可以做几件事:

# Just need to require the one file.
require_relative File.join('users', 'yourusername', 'prime_folder', 'prime.rb')

# Many files in the same folder
$LOAD_PATH << File.join('users', 'yourusername', 'prime_folder')
require 'prime.rb'
require 'another_file.rb'

我使用的另一种选择是Pry。它就像 irb 并且很容易从脚本中调用。它是一颗宝石,所以:

gem install pry

在脚本结束时,您可以执行以下操作:

if $0 == __FILE__
  require 'pry'
  binding.pry
end

然后,您将进入像 REPL 这样的 irb,您可以在其中测试和调试您的方法。没有它我无法生存。

于 2013-05-07T18:46:11.467 回答
0

与 ruby​​ 1.8 不同,您不能要求位于同一文件夹中的文件,因为当前文件夹不再位于加载路径上。

要模拟 ruby​​ 1.8 的行为,您可以尝试

$LOAD_PATH << "."
require 'primes.rb'

但是,正如@CharlesCaldwell 指出的那样,在 ruby​​ 1.9 中正确的做法是使用 relative_require。

这是处理此问题的最佳方法的一个很好的讨论。

请注意,relative_require 这在 irb 中不起作用。您可以在@CharlesCaldwell 答案上查看动机。

但是在你的任务问题中,你不应该使用 irb,你应该使用 pry:

我们将使用两个宝石。一种叫做 Pry,它是 irb 的替代品。你必须 gem install pry 。使用 Pry 进行调试不是必需的,但它会让生活更美好。

这是使用相对要求的示例:

[fotanus@thing ~]$ cat primes.rb 
# primes.rb

def prime?(num)
  (1..num).each do |i|
    if (num % i) == 0
      return false
    end
  end
end

def primes(num_primes)
  ps = []
  num = 1
  while ps.count < num_primes
    primes << num if prime?(num)
  end
end

if __FILE__ == $PROGRAM_NAME
  puts primes(100)
end
[fotanus@thing ~]$ cat a.rb 
require_relative 'primes.rb'
[fotanus@thing ~]$ ruby a.rb 
于 2013-05-07T18:50:37.597 回答