42 votes

Comment puis-je savoir si je cours de JRuby contre Ruby?

J'ai un script avec une usine méthode que je voudrais revenir une autre implémentation de la classe en fonction de si oui ou non le script est en cours d'exécution à partir de JRuby ou Ruby. N'importe qui ont des idées sur comment je pourrais dire la différence de l'intérieur de mon script?

Quelques pensées que j'ai eues ont été:

  • Tentative d'inclure Java " et de sauvetage de retour à la Ruby mise en œuvre en cas d'échec. Cette méthode ne fonctionne pas. Ruby est assez intelligent pour erreur indépendamment de mon début/de sauvetage/de fin.

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

Merci pour tout et toutes les idées.

50voto

JesperE Points 34356

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

44voto

vsizikov Points 525

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

  1. Simple et directe:

    RUBY_PLATFORM == "java"
    
  2. Cela peut être utilisé pour d'autres impls ainsi. L'inconvénient est que l'IRM 1.8.6 et 1.8.7 ne prennent pas en charge RUBY_ENGINE encore, donc nous avons besoin de la définir? vérifier:

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
    
  3. Si vous souhaitez en savoir un peu plus que juste de savoir si c'est JRuby ou pas:

    if defined? JRUBY_VERSION
    

    JRUBY_VERSION est défini dans JRuby et en fournit la version courte de l'info, comme "1.5.0.dev"

  4. Moins de façon préférée: besoin de "java" ou require 'jruby' et de sauvetage. Ne doit pas être utilisé.

6voto

Jörg W Mittag Points 153275

Je ne comprends pas très bien votre question. Vous semblez être un mélange de deux complètement différents niveaux d'abstraction: Ruby est un langage de programmation, JRuby est un compilateur pour le langage de programmation Ruby. La question de savoir si votre programme est en cours d'exécution en Ruby ou en JRuby tout simplement ne fait pas sens: lorsqu'il est exécuté dans JRuby, il est exécuté en Ruby, parce que JRuby est une implémentation de Ruby.

C'est la même chose que de demander "comment puis-je savoir si je suis au volant d'une Ford vs une voiture?"

Si vous voulez savoir dans quel Ruby mise en œuvre, vous êtes en cours d'exécution, puis vous pouvez vérifier le global RUBY_ENGINE constante. Il est censé universellement et identifier de manière unique le moteur vous sont en cours d'exécution, bien qu'il échoue malheureusement pour trois raisons:

  1. sur certains moteurs, il ne veut pas vous dire ce moteur, il est en cours d'exécution, par exemple sur YARV je m'attends RUBY_ENGINE être 'yarv', mais il est en fait 'ruby'. Donc, il ne parvient pas à "identifier" partie.
  2. pire encore: à l'IRM, il est également 'ruby', ce qui signifie que non seulement il n'est pas de vous dire ce moteur vous sont en cours d'exécution sur, mais il y a aussi totalement différents moteurs de retourner la même valeur. OIE, il échoue également à "uniques" partie.
  3. et le dernier mais non le moindre, RUBY_ENGINE est assez nouveau, donc il n'est pas encore supporté par tous les moteurs, ce qui signifie qu'il ne parvient pas à l ' "universel" de la partie.

Encore, pour vous à quelque chose comme

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

devrait fonctionner correctement.

2voto

user3049443 Points 1

Si vous êtes en train de déboguer un shell, irb, RVM ou un type de plugin tel que les plugins pour éditeur de texte Ruby, je préfère les plus verbeux RUBY_DESCRIPTION .

Si vous essayez d'exécuter du code basé sur JRUBY ou non, les autres constantes commentées sont bonnes: RUBY_ENGINE , JRUBY_VERSION ou RUBY_PLATFORM .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X