2009-08-27 5 views
35

J'ai un script avec une méthode d'usine que je voudrais retourner une implémentation différente d'une classe selon que le script fonctionne ou non à partir de JRuby ou Ruby. Quelqu'un at-il des idées sur la façon dont je pourrais faire la différence dans mon script?Comment savoir si je cours depuis JRuby contre Ruby?

Quelques réflexions initiales que j'avais été:

  • tentative de « inclure Java » et sauver retour à la mise en œuvre Ruby si elle échoue. Cette méthode ne fonctionne pas. Ruby est assez intelligent pour commettre des erreurs indépendamment de mon début/sauvetage/fin.

  • Faites quelque chose de goofy avec les ID de processus. Je préfère éviter cela, car il se sent toujours comme un hack.

Répondre

46

Je crois que vous pouvez vérifier la constante RUBY_PLATFORM.

+1

Oui. C'est "java" sous JRuby et l'OS sous-jacent ailleurs. – Chuck

+0

En effet. Suffisant pour moi. Merci beaucoup! – pastorius

+0

@Chuck: merci de vérifier. Je n'avais pas d'installation JRuby à portée de main. – JesperE

7

Je ne comprends pas très bien votre question. Vous semblez mélanger deux niveaux d'abstraction complètement différents: Ruby est un langage de programmation, JRuby est un compilateur pour le langage de programmation Ruby. La question de savoir si votre programme s'exécute dans Ruby ou dans JRuby n'a pas de sens: quand il s'exécute dans JRuby, il est s'exécutant dans Ruby, car JRuby est une implémentation de Ruby. C'est la même chose que de demander «comment puis-je savoir si je conduis une Ford par rapport à une voiture?».

Si vous voulez savoir dans quelle implémentation Ruby vous êtes en cours d'exécution, vous pouvez vérifier la constante globale RUBY_ENGINE. Il est censé identifier universellement et de manière unique le moteur que vous utilisez, même si elle échoue malheureusement pour trois raisons:

  1. sur certains moteurs, il ne vous dire ce que le moteur est en marche, par exemple sur YARV je m'attendrais RUBY_ENGINE à 'yarv', mais il est réellement 'ruby'. Donc, il échoue à la partie "identifier".
  2. encore pire: l'IRM, il est aussi'ruby', ce qui signifie que qui retournent la même valeur non seulement pas vous dire quel moteur ne vous utilisez, mais il aussi totalement différents moteurs. IOW, il échoue également à la partie "unique".
  3. et last but not least, RUBY_ENGINE est assez nouveau, donc il n'est pas encore supporté par tous les moteurs, ce qui signifie qu'il échoue à la partie "universelle".

encore, pour vos fins quelque chose comme

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

devrait fonctionner correctement.

+0

si défini? RUBY_ENGINE et RUBY_ENGINE == 'jruby' –

+0

Pour utiliser votre analogie, vous devez parfois savoir si votre voiture est un gué. Par exemple, vous devez savoir si vous souhaitez prendre en charge une extension native non prise en charge par jruby dans votre code. – Will

+0

Bon point sur RUBY_ENGINE étant relativement nouveau. Y avait-il une ancienne version de JRuby qui ne l'avait pas? – Trejkaz

40

Comme déjà indiqué ici, il existe plusieurs façons de détecter JRuby.Voici la liste complète, triées par préférence:

  1. simple et directe:

    RUBY_PLATFORM == "java" 
    
  2. Ceci peut être utilisé pour d'autres impls aussi bien. L'inconvénient est que MRI 1.8.6 et 1.8.7 ne supportent pas encore RUBY_ENGINE, donc nous avons besoin du défini? vérifier:

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' 
    
  3. Si vous souhaitez en savoir un peu plus que juste que ce soit JRuby ou non:

    if defined? JRUBY_VERSION 
    

    JRUBY_VERSION est uniquement définie dans JRuby et fournit court informations de version, comme "1.5.0.dev"

  4. Manière la moins préférée: exiger 'java' ou exiger 'jruby' et sauvetage. Ne devrait pas être utilisé.

+2

En fait, vous devez fournir des parenthèses pour la deuxième version afin qu'elle soit définie (RUBY_ENGINE) && RUBY_ENGINE == 'jruby' –

+1

Merci, @Tyler, en effet, c'était une erreur stupide, corrigée! – vsizikov

+0

La dernière option n'est pas aussi mauvaise que ça en a l'air. Si vous deviez tester JRuby et que vous aviez besoin de 'java' de toute façon (et si vous ne l'étiez pas, avouons-le, pourquoi ne pas essayer de détecter JRuby), alors ajouter un sauvetage ne semble pas si mal. – Trejkaz

1

Si vous shell de débogage, RIR, RVM ou un certain type de plugin comme plugins éditeur de texte Ruby Je préfère le plus bavard RUBY_DESCRIPTION.

Si vous essayez d'exécuter un code basé sur si vous utilisez JRuby ou non, d'autres constantes sont bons commentaires: RUBY_ENGINE, JRUBY_VERSION ou RUBY_PLATFORM.

Questions connexes