我怎样才能知道,如果我从JRuby的运行与红宝石?(How can I tell if I'

2019-08-02 20:56发布

我有,我想返回不同的实现取决于剧本是否被从JRuby中或Ruby运行某些类的工厂方法的脚本。 任何人对我怎么会从我的脚本中分辨什么想法?

一些最初的想法我有如下:

  • 尝试“包含的Java”和营救回Ruby实现,如果它失败。 这种方法是行不通的。 Ruby的足够聪明,报错了,无论我开始/救援/结束的。

  • 做一些愚蠢与进程ID。 我宁愿避免这种情况,因为它总是感觉就像一个黑客攻击。

Answer 1:

我相信你可以检查RUBY_PLATFORM不变。



Answer 2:

正如已经被这里所述,有多种方法来检测的JRuby。 下面是完整的列表,按优先排序:

  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”和救援。 不宜使用。



Answer 3:

我不太明白你的问题。 你似乎是混合两种完全不同的抽象层次: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'

应该正常工作。



Answer 4:

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

如果你想运行基础上,如果你正在运行JRUBY或没有一些代码,评论其他常量都不错: RUBY_ENGINEJRUBY_VERSIONRUBY_PLATFORM



文章来源: How can I tell if I'm running from JRuby vs. Ruby?
标签: ruby jruby