2011-07-03 12 views
1

私はRuby on Rails 3.0.7を使用していますが、クラス(@@)とグローバル($)変数をいつ使用し、なぜ使用するべきか、またthis caseで正しく使用されているかどうかを知りたいと思います。クラスとグローバル変数を使用する時期と理由

P.S .:私はmentioned case-problemを持っているので、この質問をしています。答えには、クラス変数の使用が提案されています。そのような場合には、それを使用することをお勧めします。

+0

これをスタンドアロンの質問にするために時間をかけてください。あなたは元の問題を参照することができますが、これはどこにも行かずに理解できるはずです。 – edgerunner

+0

@edgerunner - 質問を「独立して理解できる」ように更新しました。 – Backo

+1

それはあなたの他の質問が理にかなっている必要があります。時間をかけてこの質問を独自に立ててください。 (IE。あなたの他の質問が削除された場合でも、それは理解できるはずです) – edgerunner

答えて

3

短い答えは:neverです。

私は、Rubyする新しいんだけど、私は他の言語からこのくらいのを知っていますか:グローバル変数は決してスレッドセーフです。

同じ行に沿って、一意のスレッドしか処理しない限り、ペストのようなシングルトンパターンは避けてください。


編集:

余談として、ルビー依存性の注入のためにグーグルでは、Rubyはそれのいずれかを必要としないことを示唆しています。さて、何を教えてください。します。

宝石や図書館の山があり、そこには何もないとは常に想定されていたので、彼らは基本的にあなたがたった一つのスレッドとIOブロックを持つと仮定します。最初からそうしていなければ、スレッドセーフで非ブロッキングであったかもしれません。しかし、現在、彼らはそうではありません。

彼らはそうしていましたが、イベントドリブンのサーバーでもうまくいきました。

物事が立てば、それは血まみれの混乱です。

イベントマシンはスレッドセーフではありません。シンとゴリアートは同じトークンではありません。 Rack-asyncは、基本的にはすべてのものにパッチを当てた猿です。乗客はフォークを使用し、レール付きのREE/1.8.7をインストールするとスマートになります。 Mongrelはスレッドセーフですが、IOブロッキングです。 WebrickはシングルスレッドとIOブロッキングです。リストは続く。それはただ面倒です。

+1

スレッドセーフなコードを書くのは簡単ですか? –

+1

それは簡単ではありません。まったく。 –

0

クラス変数は、クイックアンドダーティなキャッシングの形式に使用できます。

class Thing 
    def expensiveCall 
    unless @@expensiveResult 
     @@expensiveResult = ['foo','bar','baz'] # or whatever 
    end 
    @@expensiveResult 
    end 
end 
関連する問題