45

スクリプトがJRubyまたはRubyのどちらから実行されているかに応じて、あるクラスの異なる実装を返したいファクトリメソッドを持つスクリプトがあります。スクリプト内との違いをどのように見分けることができるかについて、誰かアイデアがありますか?

私が持っていたいくつかの最初の考えは次のとおりでした:

  • 'Javaを含める'ことを試み、失敗した場合はRubyの実装に戻ってください。この方法は機能しません。Rubyは、開始/レスキュー/終了に関係なくエラーが発生するほど賢いです。

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

4

4 に答える 4

52

RUBY_PLATFORM定数を確認できると思います。

于 2009-08-27T17:24:23.687 に答える
47

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

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

    RUBY_PLATFORM == "java"
    
  2. これは、他の impl にも使用できます。欠点は、MRI 1.8.6 と 1.8.7 がまだ RUBY_ENGINE をサポートしていないことです。小切手:

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
    
  3. JRuby かどうかだけでなく、もう少し知りたい場合は、次のようにします。

    if defined? JRUBY_VERSION
    

    JRUBY_VERSION は JRuby でのみ定義され、"1.5.0.dev" のような短いバージョン情報を提供します。

  4. 最も好まない方法: require 'java' または require 'jruby' とレスキュー。使用しないでください。

于 2009-11-06T07:23:52.007 に答える
6

あなたの質問がよくわかりません。Ruby はプログラミング言語であり、JRuby は Ruby プログラミング言語のコンパイラです。プログラムが Ruby で実行されているか、JRuby で実行されているかという質問は、単純に意味を成しません。JRuby で実行されている場合、Ruby で実行されていることになります。JRuby は Ruby の実装であるためです。

それは、「自分が運転している車がフォードか車か、どうすればわかるだろうか?」と尋ねるのと同じです。

実行している Ruby 実装を知りたい場合は、グローバルRUBY_ENGINE定数を確認できます。実行しているエンジンを普遍的かつ一意に識別することになっていますが、残念ながら次の 3 つの理由で失敗します。

  1. 一部のエンジンでは、実行されているエンジンがわかりません。たとえば、YARV では であると予想RUBY_ENGINEされますが'yarv'、実際には'ruby'. そのため、「識別」の部分で失敗します。
  2. さらに悪いことに、MRI でも です 'ruby'これは、実行しているエンジンがわからないだけでなく、同じ値を返すまったく異なるエンジンがあることを意味します。IOW、「ユニーク」部分でも失敗します。
  3. 最後になりましたが、RUBY_ENGINEかなり新しいため、まだすべてのエンジンでサポートされているわけではありません。つまり、「ユニバーサル」部分で失敗します。

それでも、あなたの目的のために

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

正常に動作するはずです。

于 2009-08-29T12:14:31.407 に答える
2

シェル、irb、RVM、または Ruby テキスト エディター プラグインなどの何らかのタイプのプラグインをデバッグしている場合は、より詳細なRUBY_DESCRIPTION.

JRUBY を実行しているかどうかに基づいてコードを実行しようとしている場合は、コメントされている他の定数が適切です: RUBY_ENGINEJRUBY_VERSIONまたはRUBY_PLATFORM.

于 2014-08-15T17:14:02.503 に答える