如何判断我是从JRuby还是Ruby运行?

我有一个带有工厂方法的脚本,根据该脚本是从JRuby还是Ruby运行,我想返回某个类的不同实现。 有人对我如何从脚本内部分辨出任何区别有任何想法吗?

我最初的想法是:

  • 尝试“包含Java”并在失败时恢复到Ruby实现。 此方法无效。 Ruby足够聪明,无论我的开始/救援/结束如何,都会出错。

  • 对进程ID进行愚蠢的处理。 我宁愿避免这种情况,因为它总是感觉像是一种hack。

pastorius asked 2020-08-11T23:02:47Z
4个解决方案
50 votes

我相信您可以检查RUBY_PLATFORM常数。

JesperE answered 2020-08-11T23:02:53Z
44 votes

正如这里已经提到的,有多种检测JRuby的方法。 这是完整列表,按首选项排序:

  1. 简单明了:

    RUBY_PLATFORM == "java"
    
  2. 这也可以用于其他展示。 缺点是MRI 1.8.6和1.8.7还不支持RUBY_ENGINE,所以我们需要定义吗? 检查:

    if defined? JRUBY_VERSION
    
  3. 如果您想了解的不仅仅是JRuby,还可以:

    if defined? JRUBY_VERSION
    

    JRUBY_VERSION仅在JRuby中定义,并且在其中提供了简短的版本信息,例如“ 1.5.0.dev”

  4. 最不喜欢的方式:要求'java'或要求'jruby'进行救援。 不应该使用。

Vladimir Sizikov answered 2020-08-11T23:03:35Z
6 votes

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

就像问“我如何分辨我是驾驶福特还是驾车?”一样。

如果您想知道您正在哪种Ruby实现中运行,则可以检查全局RUBY_ENGINE常量。 尽管不幸的是,它由于以下三个原因而失败了,但它应该可以普遍且唯一地标识您正在运行的引擎。

  1. 在某些引擎上,它不会告诉您正在运行的引擎,例如在YARV上,我希望RUBY_ENGINE'yarv',但实际上为'ruby'。因此,它在“识别”部分失败。
  2. 更糟糕的是:在MRI上,它也是RUBY_ENGINE,这意味着它不仅不会告诉您正在运行的引擎,而且还会返回完全相同的值的完全不同的引擎。 IOW,它在“唯一”部分也失败。
  3. 最后但并非最不重要的一点是,RUBY_ENGINE是相当新的,因此尚未被所有引擎支持,这意味着它在“通用”部分失败了。

尽管如此,出于您的目的,类似

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

应该工作正常。

Jörg W Mittag answered 2020-08-11T23:04:27Z
2 votes

如果您要调试shell,irb,RVM或某种类型的插件(如Ruby文本编辑器插件),则我更喜欢RUBY_ENGINE

如果您尝试基于是否运行JRUBY来运行某些代码,则注释的其他常量也不错:RUBY_ENGINEJRUBY_VERSIONRUBY_PLATFORM

user3049443 answered 2020-08-11T23:04:52Z
translate from https://stackoverflow.com:/questions/1342535/how-can-i-tell-if-im-running-from-jruby-vs-ruby