63

しばらく Ruby on Rails をいじっていたので、実際のソースを調べてみることにしました。GitHub からリポジトリを取得し、探し始めました。何をしているのか、何を参照しているのかよくわからないコードに出くわしました。

このコードは actionmailer/test/abstract_unit.rb で見ました

root = File.expand_path('../../..', __FILE__)
 begin
 require "#{root}/vendor/gems/environment"
 rescue LoadError
 $:.unshift("#{root}/activesupport/lib")
 $:.unshift("#{root}/actionpack/lib")
end

lib = File.expand_path("#{File.dirname(__FILE__)}/../lib")
$:.unshift(lib) unless $:.include?('lib') || $:.include?(lib)

require 'rubygems'
require 'test/unit'

require 'action_mailer'
require 'action_mailer/test_case'

$: (別名「ブリング」) が参照しているものを教えてもらえますか?

4

5 に答える 5

70

$ローカル変数、@instance 変数、または @@class 変数とは対照的に、グローバル変数を識別します。

言語が提供するグローバル変数の中には$:、によっても識別される があります。$LOAD_PATH

于 2009-12-13T16:31:46.583 に答える
38

$: は、外部ファイルの検索に使用されるグローバル変数です。

http://www.zenspider.com/Languages/Ruby/QuickRef.html#18より

$: load または require によるスクリプトおよびバイナリ モジュールのロード パス。

于 2009-12-13T15:59:56.387 に答える
8

Ruby の奇妙な点に注目したい!

$確かにロードパスを意味します。そして;「エンドライン」を意味します。しかし!

$;フィールド区切りを意味します。$;.to_sREPL で実行してみると、 が返されることがわかります","。それがすべてではありません!$他のサフィックスを使用すると、他の多くのことを意味する可能性があります

なんで?まあ、もちろんPerlです!

于 2017-11-01T02:06:50.970 に答える
4

Ruby フォーラムを引用するには:

ruby には事前定義された変数のセットが付属しています

$: = default search path (array of paths)
__FILE__ = current sourcefile

私がそれを正しければ(100%確実ではありません)、現在のファイルを調べて、この検索パスの配列にlibパスを追加します。これは必ずしも最良の方法ではありません。私は単純に RAILS_ROOT から始めます (少なくとも Rails プロジェクトの場合)。

于 2009-12-13T16:00:48.180 に答える
3
$:.unshift

と同じです

$LOAD_PATH.unshift

. 次のように言うこともできます。

$: <<
$LOAD_PATH <<

これらは、ロード パスを設定するためのかなり一般的な Ruby のイディオムです。

于 2009-12-13T16:08:38.900 に答える