2009-08-27 14 views
35

スクリプトがJRubyやRubyから実行されているかどうかによって、いくつかのクラスの異なる実装を返すファクトリメソッドがあります。誰でも私のスクリプト内の違いをどのように伝えることができるかについてのアイデアはありますか?私が持っていたし、JRuby vs. Rubyのどちらから実行しているかはどうすればわかりますか?

いくつかの初期の思考:「Javaのを含める」と、それが失敗した場合はRubyの実装に戻って救助に

  • 試み。このメソッドは機能しません。 Rubyは私のbegin/rescue/endに関係なくエラーを出すのに十分スマートです。

  • プロセスIDで何かしてください。私はむしろハックのように感じるので、むしろこれを避けたいと思います。

答えて

46

RUBY_PLATFORM定数を確認できます。

+1

JRubyのもとでは "java"で、他の場所にある基礎となるOSです。 – Chuck

+0

確かに。私のために十分に良い。どうもありがとう! – pastorius

+0

@Chuck:確認していただきありがとうございます。私は便利なJRubyをインストールしていませんでした。 – JesperE

7

私はあなたの質問をよく理解していません。 Rubyはプログラミング言語ですが、JRubyはRubyプログラミング言語のコンパイラです。あなたのプログラムがRubyで実行されているかJRubyで実行されているのかは分かりません。JRubyで実行されているときはです。なぜならJRubyはRubyを実装しているからです。

「私がフォードと自動車のどちらを運転しているのか、どうすればわかるのですか?

あなたが実行しているRuby実装を知りたい場合は、グローバルRUBY_ENGINEの定数をチェックすることができます。いくつかのエンジンの

  1. は、例えば、それが実行されているどのようなエンジンを教えてくれ、それにはない、:それは残念ながら三つの理由で失敗したが、普遍的かつユニークにあなたが実行しているエンジンを識別することになっていますYARVの場合、RUBY_ENGINE'yarv'となるはずですが、実際は'ruby'です。したがって、それは "特定"の部分で失敗します。
  2. さらに悪化:MRI上、それはまた、同じ値を返す全く異なるエンジンがないだけで、それはあなたが上で動作しているかエンジンを教えてくれないことを意味するが、これは、'ruby'です。 IOW、 "ユニークな"部分でも失敗します。
  3. 最後に、RUBY_ENGINEはかなり新しく、すべてのエンジンではまだサポートされていないため、「ユニバーサル」の部分では失敗します。

    if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby' 
    

    のようなあなたの目的のためにまだ

は、何かが正常に動作する必要があります。

+0

が定義されている場合は、 RUBY_ENGINEとRUBY_ENGINE == 'jruby' –

+0

あなたの類推を使用するには、あなたの車がフォードであるかどうかを知る必要があることがあります。たとえば、コード内でjrubyがサポートしていないネイティブ拡張をサポートするかどうかを知る必要があります。 – Will

+0

比較的新しいRUBY_ENGINEについての良い点。それを持っていない古いバージョンのJRubyはありましたか? – Trejkaz

40

すでに述べたように、JRubyを検出する方法は複数あります。ここでは好みによってソートされた完全なリストは、です:

  1. シンプルでわかりやすい:

    RUBY_PLATFORM == "java" 
    
  2. これは、他のimplsのために使用することができます。欠点は、MRI 1.8.6と1.8.7がまだRUBY_ENGINEをサポートしていないことです。チェック:

    if defined? JRUBY_VERSION 
    

    JRUBY_VERSIONのみのJRubyでとで定義されている短いが用意されています

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' 
    
  3. あなたはちょうどそれがJRubyのかいないのかどうかよりも少し詳細をお知りになりたい場合はバージョン情報、「1.5.0.dev」など

  4. 最も好きな方法: 'java'が必要な場合や、 'jruby'と救助が必要な場合。使用しないでください。

+2

実際には、2番目のバージョンの括弧を入れて定義する必要がありますか?(RUBY_ENGINE)&& RUBY_ENGINE == 'jruby' –

+1

ありがとう、@タイラー、本当に間違った修正です! – vsizikov

+0

最後のオプションはそれほど難しくありません。もしあなたがJRubyをテストしようとしていたら、とにかく 'java'を必要とするならば(もしそうでなければ、直面して、なぜJRubyを検出するのか)、救助を加えてもそれほど悪くはありません。 – Trejkaz

1

あなたはシェル、IRB、RVMまたは私は、より詳細なRUBY_DESCRIPTIONを好むRubyのテキストエディタのプラグインのようなプラグインのいくつかのタイプをデバッグしている場合。

あなたはJRubyのを実行しているかしていない場合に基づいて、いくつかのコードを実行しようとしている場合は、コメント他の定数は良いです:RUBY_ENGINEJRUBY_VERSIONまたはRUBY_PLATFORM