Подтвердить что ты не робот

Как я могу узнать, запущен ли я от JRuby против Ruby?

У меня есть script с методом factory, который хотел бы вернуть другую реализацию некоторого класса в зависимости от того, выполняется ли script из JRuby или Ruby. У кого-нибудь есть идеи о том, как я могу отличить это от моего script?

Некоторые первоначальные мысли, которые у меня были, были:

  • Попытка "включить Java" и вернуться к реализации Ruby, если она терпит неудачу. Этот метод не работает. Ruby достаточно умный, чтобы ошибиться, независимо от моего начала/спасения/конца.

  • Сделайте что-то глупое с идентификаторами процесса. Я бы предпочел избежать этого, так как он всегда выглядит как хак.

4b9b3361

Ответ 1

Я считаю, что вы можете проверить константу RUBY_PLATFORM.

Ответ 2

Как уже было сказано здесь, существует множество способов обнаружения 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" и спасения. Не следует использовать.

Ответ 3

Я не совсем понимаю ваш вопрос. Кажется, вы смешиваете два совершенно разных уровня абстракции: Ruby - это язык программирования, JRuby - это компилятор для языка программирования Ruby. Вопрос о том, работает ли ваша программа в Ruby или в JRuby, просто не имеет смысла: когда он работает в JRuby, он работает в Ruby, потому что JRuby - это реализация Ruby.

Это то же самое, что спрашивать: "Как я могу сказать, еду ли я в Ford против машины?"

Если вы хотите узнать, в какой реализации Ruby вы работаете, вы можете проверить глобальную константу RUBY_ENGINE. Он должен универсально и однозначно идентифицировать движок, на котором вы работаете, хотя, к сожалению, он не работает по трем причинам:

  • на некоторых машинах он не говорит вам, на каком движке он работает, например, на YARV. Я ожидал бы RUBY_ENGINE 'yarv', но на самом деле это 'ruby'. Таким образом, он терпит неудачу в "идентифицирующей" части.
  • еще хуже: на MRI это также 'ruby', а это означает, что он не только не говорит вам, на каком движке вы работаете, но и совершенно разные двигатели, которые возвращают одинаковое значение. IOW, он также терпит неудачу в "уникальной" части.
  • и последнее, но не менее важное, RUBY_ENGINE является довольно новым, поэтому он еще не поддерживается всеми двигателями, что означает, что он терпит неудачу в "универсальной" части.

Тем не менее, для ваших целей что-то вроде

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

должен работать нормально.

Ответ 4

Если вы отлаживаете оболочку, irb, RVM или какой-то плагин, такой как плагины текстового редактора Ruby, я предпочитаю более подробный RUBY_DESCRIPTION.

Если вы пытаетесь запустить какой-то код на основе, если вы используете JRUBY или нет, другие комментируемые константы хороши: RUBY_ENGINE, JRUBY_VERSION или RUBY_PLATFORM.