首页 文章

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

提问于
浏览
39

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

我的一些初步想法是:

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

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

4 回答

  • 44

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

  • 7

    正如这里已经说过的,有多种方法可以检测JRuby . 这是完整列表,按优先顺序排序:

    • 简单明了:

    RUBY_PLATFORM ==“java”

    • 这也可用于其他动作 . 缺点是MRI 1.8.6和1.8.7还不支持RUBY_ENGINE,所以我们需要定义?校验:

    如果定义了?(RUBY_ENGINE)&& RUBY_ENGINE =='jruby'

    • 如果你想知道的不仅仅是JRuby是不是:

    如果定义? JRUBY_VERSION
    JRUBY_VERSION仅在JRuby中定义,并提供短版本信息,如“1.5.0.dev”

    • 最不喜欢的方式:要求'java'或要求'jruby'和救援 . 不应该使用 .
  • 1

    我没有意义:当它在JRuby中运行时,它在Ruby中运行,因为JRuby是Ruby的一个实现 .

    这就像问“如果我驾驶的是福特汽车而不是汽车?”

    如果您想知道正在运行的Ruby实现,那么您可以检查全局 RUBY_ENGINE 常量 . 它应该通用且唯一地识别您正在运行的引擎,尽管它遗憾地失败有三个原因:

    • 在一些引擎上,它不会告诉你它正在运行什么引擎,例如在YARV上我希望 RUBY_ENGINE'yarv' ,但它实际上是 'ruby' . 所以,它在"identify"部分失败了 .

    • 甚至更糟:在MRI上,它也是 'ruby' ,这意味着它不仅不会告诉你正在运行什么引擎,而且还有完全不同的引擎返回相同的值 . IOW,它也在"unique"部分失败了 .

    • ,最后但并非最不重要的是, RUBY_ENGINE 是相当新的,所以所有引擎都不支持它,这意味着它在"universal"部分失败了 .

    仍然,为了你的目的,像

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

    应该工作正常 .

  • 48

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

    如果您正在运行JRUBY,则其他常量注释是好的: RUBY_ENGINEJRUBY_VERSIONRUBY_PLATFORM .

相关问题