2011-11-14 11 views
16

Rubyコードファイル(somelogic.rb)には、いくつかのメソッドとクラスがあり、/ home/user/codeにあります。今、同じディレクトリに別のクラスを作成していて、somelogic.rbのメソッドとクラスを参照したいと思います。それ、どうやったら出来るの?私はどんな入力をも大変感謝しています。別のRubyコードファイルでメソッドを参照するには?

+1

「somelogic」が必要です –

答えて

20

あなたはRuby 1.9の以降を使用している場合、これはそれを行うための最も簡単な方法です:

require_relative 'somelogic' 

あなたのコードは、ルビーの1.9以前のバージョンで作業したい場合は、あなたの代わりにこれを行う必要があります。

require File.join File.dirname(__FILE__), 'somelogic' 

あなたが選んだ行はどれも、ルビファイルの先頭に置く必要があります。 somelogic.rbで定義されているクラス、モジュール、またはグローバル変数は、プログラムで使用できます。

0

をチェックアウトは、最初の行に '/home/user/code/somelogic.rb' を必要と書きます。ここで

+3

しないでください。あなたのコードは移植可能ではありません。 – mliebelt

+0

私は、ファイルが含まれることを確信していたことを知っています(1.9.2には「require」の問題があります)。同じディレクトリにいる場合は、 'otherlogic.rb'が必要です。 –

9

はシナリオです:

/home/user/code/somelogic.rb 
class MyMath 
    def self.sin(number) 
    ... 
    end 
end 

はあなたの他のファイルmylogic.rbのメソッドsinを使用します。

Ruby 1.8.x 
require "somelogic" 
class OtherThings 
    def some_method 
    MyMath.sin(42) 
    end 
end 

使用パターンは、すべてのルビーのバージョンで同じですが、必要と文は異なる場合があります:

ルビーのバージョンに応じて、以下のいずれかの操作を行います。

Ruby 1.9.x 
require_relative "somelogic" 

または変動

Ruby 1.9.x 
require "./somelogic" 

最初の変化は、あなたがmylogic.rbsomelogic.rbが配置されているディレクトリにruby mylogic.rbを呼び出す場合にのみ、2つ目のすべての時間を動作します。あなたが別のディレクトリにある出発点からそのディレクトリからファイルをロードする場合

、あなたが使用する必要があります。

Ruby 1.8.x and Ruby 1.9.x 
$: << File.dirname(__FILE__) 

これは、Rubyのロードパスを展開します。 __FILE__の(相対)パスを読み取り、そのディレクトリを取得し、そのディレクトリの絶対パスをロードパスに追加します。したがって、参照をrequireで実行すると、ファイルが見つかります。

+5

'require '/ somelogic'と' require_relative 'somelogic'の間には重要な違いがあります。後者は、スクリプト自体に関連したファイル*を探しますが、前者は現在の作業ディレクトリを検索します。私たちが "project"というディレクトリにいて、Rubyプログラム "scripts/do_the_thing.rb"を実行したとします。 "do_the_thing.rb"が 'require_relative'を使うと、" project/scripts/somelogic.rb "を探します。一方、 'require /。somelogic''と書くと、" project/somelogic.rb "が検索されます。 – Chuck

+0

良い点、私は答えにそれを追加します。どうもありがとう! – mliebelt

+0

Chuckが言っていたことに加えて、 'require '/ somelogic'はRubyインタプリタの現在の作業ディレクトリについての憶測をひどくするので、他のプロジェクトでコードを再利用するのが難しいためです。 –

関連する問題