2016-06-29 10 views
0

私は現在、David Blackの "Well Grounded Rubyist"のモジュールについて読んでいます。kernel_require.rb:54:in 'require'(LoadError)in well grounded Rubyist

# stacklike.rb 
module Stacklike 
    def stack 
    @stack ||= [] 
    end 
    def add_to_stack(obj) 
    stack.push(obj) 
    end 
    def take_from_stack 
    stack.pop 
    end 
end 

# stack.rb 
require "stacklike" 
class Stack 
    include Stacklike 
end 

s = Stack.new 
s.add_to_stack("item one") 
s.add_to_stack("item two") 
s.add_to_stack("item three") 

puts "Objects currently on the stack: " 
puts s.stack 

taken = s.take_from_stack 
puts "Removed this object: " 
puts taken 

puts "Now on stack: " 
puts s.stack 

そして、私はプログラム、$ ruby stack.rbを実行すると、私は次のエラーを取得する:

/Users/myName/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in 'require': cannot load such file -- stacklike (LoadError) from /Users/myName/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in 'require' from stack.rb:2:in '<main>'

私は運動に沿うよう、次のコードを実行しようとすると、私はエラー時につまずきますだから、stackoverflowの上でいくつかの時間を過ごし、このユーザーに同様の問題が発生した後に

からThe #require method in modules mix-ins - 私は変更しようとした:require "./stacklike"からrequire "stacklike"を、それが動作しませんでしたので、私はこれらを試してみました:

require_relative "stacklike" 
require "***I put the absolute path to the file here***" 

でも成功しません。その後、私はここに見えた:$ which -a rubyを、そして次の出力ました: ... no such file to load -- rubygems (LoadError)を、そして私は2つのルビのバージョンを持っているようだ私は走った私はRubyGemsの& 2つのルビーのバージョンが影響を与えていると思う

/Users/myName/.rvm/rubies/ruby-2.2.0/bin/ruby 
/usr/bin/ruby 

を"require"を使用するときのパス検索/ロードの場所。今、私は1つのバージョンを削除する必要があるのか​​、それとも両方が必要なのか不思議です。 OS X Yosemite(10.10.2)を実行していて、ruby -vを実行すると、次のように表示されます。ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]

両方のバージョンが必要ですか?私は1つのルビーバージョンを削除する必要がある場合、どのバージョンを削除し、どのようにする必要がありますか?私はできるだけ徹底的にしようとしましたが、私が提供する他の情報を教えてください。

編集1:はい、両方のファイル(stack.rb、stacklike.rbは)同じディレクトリに

編集2以下のとおりです。私はrequire_relative "stacklike" を使用してみましたが、それはどちらか動作しません。私はまた、&ルビーをusr/binから削除しようとしましたが、そこには成功しませんでした - 私はまだ同じロードエラーを取得します。

編集3:ruby stack.rbを実行するときrvm install ruby 2.3.0を実行した後、私は、次の出力負荷エラーを受信:require_relative 'stacklike'

編集4:

`/Users/myName/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- stacklike (LoadError) 
from /Users/myName/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
from stack.rb:2:in `<main>'` 

I 2にstack.rbラインを変更
Iが実行されましたrvm implode、次にbrew install ruby。今度は同じエラーが発生しますが、別のパスから/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in require ':そのようなロードできませんファイル - stacklike(LoadError)/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55から:require 'from stack.rb:2 :

"に(今私はrvmを逃したが、少なくともwhich -a ruby出力usr/local/bin/rubyよ)

編集5(FINAL EDIT):私はちょうど&ファイルに新しいディレクトリを作成し、今では何とか動作しますが、ルビーを再インストールしました。あなたのお手伝いをしてくれてありがとう。&!

+0

は、同じディレクトリに 'stack.rb'と' stacklike.rb'ですか? –

+0

@ sagarpandya82はい、両方のファイルが同じディレクトリにあります – user1234

+0

ので、/ usr/binから 'ruby'と' gem'を削除してください –

答えて

0

ここでは、require_relativeの代わりにrequireを使用しています。違いを理解するには、thisを参照してください。これを覚えるのが最も簡単な方法は、私がrequireが宝石とライブラリのために教えられた方法です。require_relativeはファイルです。あなたが気にしない場合

私もあなたの仕事上のいくつかの批判を持っている:

require_relative "stacklike" 

class Stack 
    include Stacklike #<= Initiate the module 
end 

STACK_INFO = Stack.new #<= Turn the non-descriptive 's' into a more descriptive constant STACK_INFO 

def add_info #<= Create a method to add more information to the stack 
    STACK_INFO.add_to_stack("item one") 
    STACK_INFO.add_to_stack("item two") 
    STACK_INFO.add_to_stack("item three") 
end 

def objects_in_stack? #<= Create a method for the information that's inside of the stack 
    puts "Objects currently on the stack: " 
    puts STACK_INFO.stack 
end 

def taken? #<= Create a method for what's taken from the stack 
    taken = STACK_INFO.take_from_stack 
    puts "Removed this object: \e[31m#{taken}\e[0m" #<= Makes colored console output 
end 

add_info 
puts objects_in_stack? 
puts taken? 
puts objects_in_stack? 

module Stacklike 
    #<= Spaces are important in Ruby, mostly because it makes Ruby readable. 
    def stack 
    @stack ||= [] 
    end 

    def add_to_stack(obj) 
    stack.push(obj) 
    end 

    def take_from_stack 
    stack.pop 
    end 

end 

これは非常に基本的であり、あなたが引数変数として与えられ、スタックからの情報を有する限り行くことができます、 Rubyの概念はOOPです.OOPのコンセプトは、すべてがうまく機能するシステムを作ることです。とにかくそれが私の理解です。私はこれがあなたの質問に答えることを願っています。


EDITまた、あなたはRVMがインストールされているrvm install ruby 2.3.0をすれば、ルビーの最新バージョンをインストールしてみてください可能性が

。これにより、最新バージョンがインストールされ、Rubyを実行できます。

+1

は、rvm 1.26.10 – user1234

+0

を使ってこれを試してみます。 'rvm install ruby​​ 2.3.0'の後に、私は新しいloaderrorを持っています。lookそれは54行目から55行目に変更されたようです.OPの編集3で新しいエラーが表示されます。 – user1234

+0

@ user1234うれしいニュースは、私たちがもっと遠くになっていくということです。lol – 13aal