rails - ¿Cómo puedo saber si estoy huyendo de JRuby vs. Ruby?
jruby on rails (4)
Como ya se ha indicado aquí, existen múltiples formas de detectar JRuby. Aquí está la lista completa, ordenada por preferencia:
Simple y directo:
RUBY_PLATFORM == "java"
Esto también se puede usar para otras impls. La desventaja es que MRI 1.8.6 y 1.8.7 aún no son compatibles con RUBY_ENGINE, entonces ¿necesitamos el definido? comprobar:
if defined?(RUBY_ENGINE) && RUBY_ENGINE == ''jruby''
Si desea saber un poco más que solo si es JRuby o no:
if defined? JRUBY_VERSION
JRUBY_VERSION solo se define en JRuby y proporciona la información de versión corta, como "1.5.0.dev"
La forma menos favorita: requiere ''java'' o requiere ''jruby'' y rescate. No debería ser usado.
Tengo un script con un método de fábrica que me gustaría devolver una implementación diferente de alguna clase dependiendo de si el script se está ejecutando desde JRuby o Ruby. ¿Alguien tiene alguna idea sobre cómo puedo ver la diferencia desde el interior de mi script?
Algunos pensamientos iniciales que tuve fueron:
Intenta "incluir Java" y rescata a la implementación de Ruby si falla. Este método no funciona. Ruby es lo suficientemente inteligente como para equivocarse independientemente de mi comienzo / rescate / final.
Haz algo tonto con los ID de proceso. Prefiero evitar esto, ya que siempre se siente como un truco.
Creo que puede verificar la constante RUBY_PLATFORM.
No entiendo muy bien tu pregunta. Parece que estás mezclando dos niveles de abstracción completamente diferentes: Ruby es un lenguaje de programación, JRuby es un compilador del lenguaje de programación Ruby. La pregunta de si su programa se está ejecutando en Ruby o en JRuby simplemente no tiene sentido: cuando se está ejecutando en JRuby, se está ejecutando en Ruby, porque JRuby es una implementación de Ruby.
Es lo mismo que preguntar "¿cómo puedo saber si estoy conduciendo un Ford o un automóvil?"
Si desea saber en qué implementación de Ruby se está ejecutando, puede verificar la constante global RUBY_ENGINE
. Se supone que identifica universal y exclusivamente el motor en el que se está ejecutando, aunque desafortunadamente falla por tres razones:
- en algunos motores, no te dice en qué motor se está ejecutando, por ejemplo en
RUBY_ENGINE
esperaría queRUBY_ENGINE
sea''yarv''
, pero en realidad es''ruby''
. Por lo tanto, falla en la parte "identificar". - aún peor: en MRI, también es
''ruby''
, lo que significa que no solo no te dice en qué motor estás trabajando, sino que también hay motores totalmente diferentes que devuelven el mismo valor. IOW, también falla en la parte "única". - y por último pero no menos importante,
RUBY_ENGINE
es bastante nuevo, por lo que aún no es compatible con todos los motores, lo que significa que falla en la parte "universal".
Aún así, para sus propósitos algo así como
if defined? RUBY_ENGINE && RUBY_ENGINE == ''jruby''
debería funcionar bien
Si está depurando shell, irb, RVM o algún tipo de complemento como los plugins de editor de texto de Ruby, prefiero la RUBY_DESCRIPTION
más detallada.
Si intenta ejecutar un código basado en si está ejecutando JRUBY o no, otras constantes comentadas son buenas: RUBY_ENGINE
, JRUBY_VERSION
o RUBY_PLATFORM
.