Как я могу узнать, бегу ли я от JRuby против Ruby? - PullRequest
41 голосов
/ 27 августа 2009

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

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

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

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

Ответы [ 4 ]

49 голосов
/ 27 августа 2009

Полагаю, вы можете проверить постоянную RUBY_PLATFORM.

44 голосов
/ 06 ноября 2009

Как уже было сказано, существует несколько способов обнаружения JRuby. Вот полный список, отсортированный по предпочтению:

  1. Просто и понятно:

    RUBY_PLATFORM == "java"
    
  2. Это может быть использовано и для других имплов. Недостатком является то, что MRI 1.8.6 и 1.8.7 еще не поддерживают RUBY_ENGINE, поэтому нам нужно определить? проверьте:

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
    
  3. Если вы хотите знать немного больше, чем просто, является ли это JRuby или нет:

    if defined? JRUBY_VERSION
    

    JRUBY_VERSION определяется только в JRuby и предоставляет краткую информацию о версии, например, "1.5.0.dev"

  4. Наименее любимый способ: требовать «java» или «jruby» и спасаться. Не следует использовать.

7 голосов
/ 29 августа 2009

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

Это то же самое, что спросить: «Как я могу определить, еду ли я в Форде против автомобиля?»

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

  1. на некоторых двигателях, он не говорит вам, на каком двигателе он работает, например, на YARV я бы ожидал, что RUBY_ENGINE будет 'yarv', но на самом деле это 'ruby'. Таким образом, он терпит неудачу в части «идентификации».
  2. еще хуже: на МРТ он также также 'ruby', что означает, что он не только не сообщает вам, на каком двигателе вы работаете, но и полностью отличается двигатели, которые возвращают такое же значение. IOW, это также терпит неудачу в «уникальной» части.
  3. и, наконец, что не менее важно, RUBY_ENGINE является довольно новым, поэтому он еще не поддерживается всеми движками, что означает, что он выходит из строя в «универсальной» части.

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

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

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

2 голосов
/ 15 августа 2014

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

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

...