如何判断我是从JRuby与Ruby运行的呢?

时间:2009-08-27 17:23:37

标签: ruby jruby

我有一个带有工厂方法的脚本,我希望返回某个类的不同实现,具体取决于脚本是从JRuby还是Ruby运行。任何人都有任何关于如何从我的脚本中区分出来的想法?

我的一些初步想法是:

  • 如果失败,尝试'包含Java'并抢回Ruby实现。此方法不起作用。无论我的开始/救援/结束如何,Ruby都足够聪明。

  • 使用进程ID做一些傻瓜。我宁愿避免这种情况,因为它总是像黑客一样。

4 个答案:

答案 0 :(得分:49)

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

答案 1 :(得分:44)

正如这里已经说过的,有多种方法可以检测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'并进行救援。不应该使用。

答案 2 :(得分:7)

我不太明白你的问题。您似乎混合了两个完全不同的抽象级别: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相当新,所以所有引擎都不支持它,这意味着它在“通用”部分失败。
  4. 仍为您的目的

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

    应该可以正常工作。

答案 3 :(得分:2)

如果您正在调试shell,irb,RVM或某些类型的插件(如Ruby文本编辑器插件),我更喜欢更详细的RUBY_DESCRIPTION

如果您尝试运行某些代码,如果您是否正在运行JRUBY,则评论的其他常量很好:RUBY_ENGINEJRUBY_VERSIONRUBY_PLATFORM