57

(実行中のスクリプトと)同じディレクトリにあるファイルを要求するより短い方法はありますか?

require File.expand_path(File.dirname(__FILE__) + '/some_other_script')

私はそれを読み、require "my_script"実際require "./my_script"にスクリプトを2回ロードします(rubyはそれが実際に同じスクリプトであることを認識しません)。これが推奨される理由File.expand_pathです。スクリプトが必要になるたびに使用される場合は、ロードされるだけです。一度。

Rubyのような簡潔な言語がより短い解決策を持っていないように見えるのは私には奇妙に思えます。たとえば、Pythonには次のようなものがあります。

import .some_other_module_in_the_same_directory

モンキーパッチができたと思いrequireますが…でもそれは悪です!;-)

4

4 に答える 4

100

ruby 1.9以降、を使用できますrequire_relative

CoreAPIの最新のドキュメントrequire_relativeまたは別のバージョンを確認してください。

于 2011-10-22T19:40:16.113 に答える
13

必要なだけですfilename

filenameはい、とを指定すると2回インポートされる./filenameので、そうしないでください。を指定し.rbていないので、パスを指定しないでください。私は通常、アプリケーションロジックの大部分をのファイルに入れてから、次のようなlibスクリプトを作成します。bin

#!/usr/bin/env ruby

$: << File.join(File.dirname(__FILE__), "/../lib")
require 'app.rb'
App.new.run(ARGV)

もう1つの利点は、アプリケーションロジックのロードによって自動的に実行が開始されない場合に、単体テストを実行しやすくなることです。

于 2009-04-26T13:01:17.500 に答える
3

上記は、他のディレクトリからスクリプトを実行している場合でも機能します。ただし、同じディレクトリ内では、参照する短い形式は期待どおりに機能し、少なくとも ruby​​ 1.9 では、二重要求は発生しません。

testa.rb

puts "start test A"
require 'testb'
require './testb'
puts "finish test A"

testb.rb

puts "start test B"
puts "finish test B"

「ruby testa.rb」を実行すると、次のようになります。

start test A
start test B
finish test B
finish test A

ただし、長い形式は別のディレクトリからでも機能します (例: ruby​​ somedir/script.rb)。

于 2009-04-25T12:55:53.170 に答える
3

これを標準ライブラリ ディレクトリ (デフォルトの loadpath に既にある場所$:)に配置します。

# push-loadpath.rb
if caller.first
  $: << File.expand_path(File.dirname(caller.first))
end

次に、これは機能するはずです

% ls /path/to/
bin.rb lib1.rb lib2.rb #...
% cat /path/to/bin.rb
load 'push-loadpath.rb'
require 'lib1'
require 'lib2'
#...

caller現在のコールスタックへのアクセスを提供し、どのファイルとどこにあるのかを教えてくれるので、それpush-loadpath.rbを使用してそれをロードパスに追加したファイルを追加しますload

load本体を複数回呼び出すことができるように、ファイルではなくファイルを使用する必要があることに注意してくださいrequire(ロードパスを変更するたびに 1 回)。

または、ボディをメソッドでラップすることもできます。

# push-loadpath.rb
def push_loadpath
  $: << File.expand_path(File.dirname(caller.first))
end

これにより、次のようrequireに使用できるようになります。

% ls /path/to/
bin.rb lib1.rb lib2.rb #...
% cat /path/to/bin.rb
require 'push-loadpath'
push_loadpath
require 'lib1'
require 'lib2'
#...
于 2009-04-25T13:56:32.650 に答える