我有,我想返回不同的实现取决于剧本是否被从JRuby中或Ruby运行某些类的工厂方法的脚本。 任何人对我怎么会从我的脚本中分辨什么想法?
一些最初的想法我有如下:
尝试“包含的Java”和营救回Ruby实现,如果它失败。 这种方法是行不通的。 Ruby的足够聪明,报错了,无论我开始/救援/结束的。
做一些愚蠢与进程ID。 我宁愿避免这种情况,因为它总是感觉就像一个黑客攻击。
我有,我想返回不同的实现取决于剧本是否被从JRuby中或Ruby运行某些类的工厂方法的脚本。 任何人对我怎么会从我的脚本中分辨什么想法?
一些最初的想法我有如下:
尝试“包含的Java”和营救回Ruby实现,如果它失败。 这种方法是行不通的。 Ruby的足够聪明,报错了,无论我开始/救援/结束的。
做一些愚蠢与进程ID。 我宁愿避免这种情况,因为它总是感觉就像一个黑客攻击。
我相信你可以检查RUBY_PLATFORM不变。
正如已经被这里所述,有多种方法来检测的JRuby。 下面是完整的列表,按优先排序:
简单明了:
RUBY_PLATFORM == "java"
这可以用于其他impls为好。 不足之处是MRI 1.8.6和1.8.7不支持RUBY_ENGINE还,所以我们需要定义? 校验:
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
如果你想知道的不仅仅是它是否是JRuby的或不是多一点:
if defined? JRUBY_VERSION
JRUBY_VERSION仅在JRuby的定义,并在提供短版本信息,如“1.5.0.dev”
最不喜欢的方式:需要的Java“或需要“的JRuby”和救援。 不宜使用。
我不太明白你的问题。 你似乎是混合两种完全不同的抽象层次:Ruby是一种编程语言,JRuby是为Ruby编程语言的编译器。 这个问题在Ruby或JRuby中程序是否正在运行只是普通的没有任何意义:当它在JRuby的运行, 它在Ruby中运行,因为JRuby是红宝石的实现。
这是一样的问:“我怎么能告诉我们,如果我开车在福特与汽车?”
如果你想在你正在运行的Ruby实现才知道,那么你可以检查全局RUBY_ENGINE
不变。 它应该是普遍的和唯一识别您正在运行的发动机,但它不幸失败的原因有三:
RUBY_ENGINE
是'yarv'
,但它实际上是'ruby'
。 因此,它不能在“标识”的一部分。 'ruby'
,这意味着它不仅不告诉你,你正在运行什么引擎,但也完全不同的引擎返回相同的值。 IOW,也未能在“独一无二”的一部分。 RUBY_ENGINE
是相当新的,所以它尚未被所有的引擎,这意味着它无法在“通用”部分的支持。 不过,你的目的是这样
if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby'
应该正常工作。
如果您正在调试外壳,IRB,RVM或某些类型的如Ruby的文本编辑器插件的插件我喜欢更详细的RUBY_DESCRIPTION
。
如果你想运行基础上,如果你正在运行JRUBY或没有一些代码,评论其他常量都不错: RUBY_ENGINE
, JRUBY_VERSION
或RUBY_PLATFORM
。