我怎么知道我是从JRuby还是Ruby运行?

我有一个工厂方法的脚本,我想根据脚本是否从JRuby或Ruby运行返回一个类的不同的实现。 任何人有任何想法,我怎么可以从我的脚本内区分?

我有一些最初的想法是:

  • 尝试“包含Java”,如果失败,则恢复到Ruby实现。 此方法不起作用。 无论我的开始/救援/结束,Ruby都足够聪明,可以排除错误。

  • 用进程ID做一些愚蠢的事情。 我宁愿避免这一点,因为它总是感觉像一个黑客。

我相信你可以检查RUBY_PLATFORM常量。

如前所述,有多种方法可以检测JRuby。 这是完整的清单,按喜好sorting:

  1. 简单而直接:

    RUBY_PLATFORM == "java" 
  2. 这可以用于其他impls以及。 缺点是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'和救援。 不应该使用。

我不太明白你的问题。 您似乎混合了两种完全不同的抽象层次:Ruby是一种编程语言,JRuby是Ruby编程语言的编译器。 您的程序是在Ruby还是在JRuby中运行的问题没有意义:当它在JRuby中运行时,它在Ruby中运行,因为JRuby是Ruby的实现。

这就像问我“如何知道我是否在福特驾驶汽车?”

如果您想知道您正在运行的是哪个Ruby实现,那么您可以检查全局RUBY_ENGINE常量。 它应该是普遍和唯一的识别你正在运行的引擎,但不幸的是由于三个原因失败:

  1. 在一些引擎上,它不会告诉你它运行的是什么引擎,例如在YARV上,我期望RUBY_ENGINE'yarv' ,但实际上它是'ruby' 。 所以它在“识别”部分失败。
  2. 更糟糕的是:在MRI上,它也是 'ruby' ,这意味着它不仅不告诉你你正在运行什么引擎,还有完全不同的引擎返回相同的价值。 IOW,在“独特”部分也失败了。
  3. 最后但并非最不重要的, RUBY_ENGINE是相当新的,所以它还不被所有的引擎支持,这意味着它在“通用”部分失败。

尽pipe如此,为了你的目的

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

应该工作正常。

如果您正在debuggingshell,irb,RVM或某些types的插件(如Ruby文本编辑器插件),则更喜欢使用更详细的RUBY_DESCRIPTION

如果你正试图运行一些代码,如果你正在运行JRUBY,其他常量评论是好的: RUBY_ENGINEJRUBY_VERSIONRUBY_PLATFORM