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>'

以下の2番目のソリューションを実行すると、次のようになります。

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

ruby 1.8 とは異なり、現在のフォルダーがロード パス上にないため、同じフォルダーにあるファイルを要求することはできません。

ruby 1.8 の動作をエミュレートするには、以下を試してください。

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

ただし、@CharlesCaldwell が指摘したように、Ruby 1.9 で行う正しい方法は、relative_require を使用することです。

これに対処する最善の方法についての良い議論があります。

relative_require irb では機能しないことに注意してください。@CharlesCaldwellの回答で動機を確認できます。

しかし、タスクの質問を見ると、irb を使用するべきではなく、pry を使用する必要があります。

2 つの宝石を使用します。1 つは 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 に答える