Ответ 1
Я считаю, что вы можете проверить константу RUBY_PLATFORM.
У меня есть script с методом factory, который хотел бы вернуть другую реализацию некоторого класса в зависимости от того, выполняется ли script из JRuby или Ruby. У кого-нибудь есть идеи о том, как я могу отличить это от моего script?
Некоторые первоначальные мысли, которые у меня были, были:
Попытка "включить Java" и вернуться к реализации Ruby, если она терпит неудачу. Этот метод не работает. Ruby достаточно умный, чтобы ошибиться, независимо от моего начала/спасения/конца.
Сделайте что-то глупое с идентификаторами процесса. Я бы предпочел избежать этого, так как он всегда выглядит как хак.
Я считаю, что вы можете проверить константу RUBY_PLATFORM.
Как уже было сказано здесь, существует множество способов обнаружения JRuby. Здесь полный список, отсортированный по предпочтению:
Простой и понятный:
RUBY_PLATFORM == "java"
Это может использоваться и для других имплантов. Недостатком является то, что MRI 1.8.6 и 1.8.7 пока не поддерживают RUBY_ENGINE, поэтому нам нужны определенные? проверьте:
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
Если вы хотите узнать немного больше, чем просто JRuby или нет:
if defined? JRUBY_VERSION
JRUBY_VERSION определяется только в JRuby и предоставляет короткую информацию о версии, например "1.5.0.dev"
Наименее любимый способ: требует "java" или требует "jruby" и спасения. Не следует использовать.
Я не совсем понимаю ваш вопрос. Кажется, вы смешиваете два совершенно разных уровня абстракции: Ruby - это язык программирования, JRuby - это компилятор для языка программирования Ruby. Вопрос о том, работает ли ваша программа в Ruby или в JRuby, просто не имеет смысла: когда он работает в JRuby, он работает в Ruby, потому что JRuby - это реализация Ruby.
Это то же самое, что спрашивать: "Как я могу сказать, еду ли я в Ford против машины?"
Если вы хотите узнать, в какой реализации Ruby вы работаете, вы можете проверить глобальную константу RUBY_ENGINE
. Он должен универсально и однозначно идентифицировать движок, на котором вы работаете, хотя, к сожалению, он не работает по трем причинам:
RUBY_ENGINE
'yarv'
, но на самом деле это 'ruby'
. Таким образом, он терпит неудачу в "идентифицирующей" части.'ruby'
, а это означает, что он не только не говорит вам, на каком движке вы работаете, но и совершенно разные двигатели, которые возвращают одинаковое значение. IOW, он также терпит неудачу в "уникальной" части.RUBY_ENGINE
является довольно новым, поэтому он еще не поддерживается всеми двигателями, что означает, что он терпит неудачу в "универсальной" части.Тем не менее, для ваших целей что-то вроде
if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby'
должен работать нормально.
Если вы отлаживаете оболочку, irb, RVM или какой-то плагин, такой как плагины текстового редактора Ruby, я предпочитаю более подробный RUBY_DESCRIPTION
.
Если вы пытаетесь запустить какой-то код на основе, если вы используете JRUBY или нет, другие комментируемые константы хороши: RUBY_ENGINE
, JRUBY_VERSION
или RUBY_PLATFORM
.