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

pas*_*ius 42 ruby jruby

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

我的一些初步想法是:

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

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

Jes*_*erE 50

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


Vla*_*kov 44

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

  1. 简单明了:

    RUBY_PLATFORM == "java"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这也可以用于其他动作.缺点是MRI 1.8.6和1.8.7还不支持RUBY_ENGINE,所以我们需要定义?校验:

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果你想知道的不仅仅是它是否是JRuby:

    if defined? JRUBY_VERSION
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • 实际上,你必须为第二个版本提供括号,如果定义了它?(RUBY_ENGINE)&& RUBY_ENGINE =='jruby' (2认同)

Jör*_*tag 6

我不太明白你的问题.您似乎混合了两个完全不同的抽象级别:Ruby是一种编程语言,JRuby是Ruby编程语言的编译器.这个问题在Ruby或JRuby中程序是否正在运行只是普通的没有任何意义:当它在JRuby的运行,它用Ruby运行,因为JRuby是红宝石的实现.

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

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

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

仍然,为了你的目的,像

if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby'
Run Code Online (Sandbox Code Playgroud)

应该工作正常.